re.sub() 具有非空替换会吃掉 Python 中的后续字符
re.sub() with a non-empty substitution eats up following character in Python
我试图通过插入一组非字母字符来分隔具有两个相邻元音的单词。当我将 re.sub()
与非空替换一起使用时,结果显示插入但插入似乎有 "eaten up" 以下字符。
这是一个例子
import = re
word = "aorta"
re.sub('(?<=[AEOUaeouy])(?:[aeoui])', '[=]', word)
#actual output => 'a[=]r[=]ta'
#expected output => 'a[=]or[=]ta'
为什么插入后的字符被吃掉了?
您应该使用 positive lookahead(一种仅检查是否存在某些字符而不实际将它们添加到匹配值的非消耗模式),而不是非捕获组(一种消耗模式将匹配的字符放入用 re.sub
).
替换的匹配值中
使用
import re
word = "aorta"
print(re.sub('([AEOUaeouy])(?=[aeoui])', r'[=]', word))
# => a[=]orta
参见Python demo。
注意:如果你想得到'a[=]or[=]ta'
,在lookbehind字符class后加上r
,[AEOUaeouy]
=> [AEOUaeouyr]
.
详情
([AEOUaeouy])
- 第 1 组:模式中定义的任何一个字符
(?=[aeoui])
- 字符后跟字符 class 的位置
- 在替换模式中,插入第 1 组捕获的值。
我试图通过插入一组非字母字符来分隔具有两个相邻元音的单词。当我将 re.sub()
与非空替换一起使用时,结果显示插入但插入似乎有 "eaten up" 以下字符。
这是一个例子
import = re
word = "aorta"
re.sub('(?<=[AEOUaeouy])(?:[aeoui])', '[=]', word)
#actual output => 'a[=]r[=]ta'
#expected output => 'a[=]or[=]ta'
为什么插入后的字符被吃掉了?
您应该使用 positive lookahead(一种仅检查是否存在某些字符而不实际将它们添加到匹配值的非消耗模式),而不是非捕获组(一种消耗模式将匹配的字符放入用 re.sub
).
使用
import re
word = "aorta"
print(re.sub('([AEOUaeouy])(?=[aeoui])', r'[=]', word))
# => a[=]orta
参见Python demo。
注意:如果你想得到'a[=]or[=]ta'
,在lookbehind字符class后加上r
,[AEOUaeouy]
=> [AEOUaeouyr]
.
详情
([AEOUaeouy])
- 第 1 组:模式中定义的任何一个字符(?=[aeoui])
- 字符后跟字符 class 的位置
- 在替换模式中,插入第 1 组捕获的值。