re.sub(python)替换匹配字符串的一部分

时间:2014-05-09 09:02:33

标签: regex python-2.7

我有一系列字符串可通过查找子字符串“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()方法。谁能告诉我做错了什么?

谢谢。

2 个答案:

答案 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