我有这样的文本:it's level I, not level II or level III.
我希望等级后的I变成1,并且只在等级I上。
我试过这个代码:text = re.sub(r'(level I)+[s,.]',r'level 1 ',text)
但我的输出是这样的:it's level 1 not level II or level III.
逗号被跳过了,我不希望它被忽略。在某些情况下也是
我有"水平而非水平"这个词。
您可以使用
import re
text = "it's level I, not level II or level III. It's Level I, not Level II or Level III."
print(re.sub(r'b([lL]evels+)Ib', r'g<1>1', text))
# => it's level 1, not level II or level III. It's Level 1, not Level II or Level III.
print(re.sub(r'(?<=b[lL]evel )Ib', '1', text))
# => it's level 1, not level II or level III. It's Level 1, not Level II or Level III.
请参阅Python演示。
注释:
b([lL]evels+)Ib
-匹配一个完整的单词level
,后面跟着一个或多个空格,然后将I
作为一个完整单词进行匹配(由于单词边界(,并用对组值的backreference替换(g<1>
是此处使用的一种unbigupus backreference语法,因为下一个字符是一个数字((?<=b[lL]evel )Ib
-匹配紧挨着前面有一个完整单词level
和一个空格的位置,然后将I
作为一个完整的单词进行匹配
注意2:您也可以使用r'b((?i:level)s+)Ib'
和r'(?<=b(?i:level) )Ib'
以完全不区分大小写的方式匹配level
。