我有一系列字符串可通过查找子字符串“p”标记后跟至少两个大写字母来识别。
输入:
<p>JIM <p>SALLY <p>ROBERT <p>Eric
我想将“p”标签更改为“i”标签,如果后面跟着那两个大写字母(那么不是最后一个,'Eric')。
期望的输出:
<i>JIM <i>SALLY <i>ROBERT <p>Eric
我在Python中使用正则表达式试过这个:
import re
Mytext = "<p>JIM <p>SALLY <p>ROBERT <p>Eric"
changeTags = re.sub('<p>[A-Z]{2}', '<i>' + re.search('<p>[A-Z]{2}', Mytext).group()[-2:], Mytext)
print changeTags
但是输出在每个实例中都使用“i”标记+ JI,而不是在第2和第3条中使用SA和RO来进行交互。
<i>JIM <i>JILLY <i>JIBERT <p>Eric
我认为问题在于我无法正确理解.group()方法。谁能告诉我做错了什么?
谢谢。
答案 0 :(得分:1)
使用预见断言的另一种方法:
re.sub(r'<p>(?=[A-Z]{2,})','<i>',MyText)
答案 1 :(得分:0)
您的内部re.search
仅评估一次,结果作为其中一个参数传递给re.sub
。这不可能捕获所有大写字母对,只捕获第一个大写字母对。这意味着您的方法无法运作,而不仅仅是您对groups
的理解。
此外,使用groups
是不必要的。
您需要使用括号捕获大写字母,并在替换表达式中将其引用为\1
:
re.sub('<p>([A-Z]{2})', r'<i>\1', Mytext)
\1
这里的意思是:替换正则表达式中第一个(...)
匹配的子字符串。 (docs)
请注意替换字符串前面的前导r
,使其成为 raw 。