Regex:替换单词后面的拉丁数字



我有这样的文本: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

最新更新