Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex re.sub(python)替换匹配字符串的一部分_Regex_Python 2.7 - Fatal编程技术网

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

Regex re.sub(python)替换匹配字符串的一部分,regex,python-2.7,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中

我有一系列字符串,它们可以通过查找子字符串“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
重新导入
Mytext=“JIMSALLYROBERTEric”
changeTags=re.sub('[A-Z]{2}',''+re.search('[A-Z]{2}',Mytext).group()[-2:],Mytext)
打印更改标签
但是输出在每个实例中都使用“i”标记+JI,而不是在条目2和条目3中交互使用SA和RO

<i>JIM <i>JILLY <i>JIBERT <p>Eric
JIM JILLY JIBERTEric 我认为问题在于我没有正确理解.group()方法。谁能告诉我我做错了什么


谢谢。

您的内部
re.search
只计算一次,结果作为参数之一传递给
re.sub
。这不可能捕获所有的大写字母对,只有第一个。这意味着您的方法无法奏效,而不仅仅是您对
组的理解

此外,不需要使用


您需要使用括号捕获大写字母,并在替换表达式中将其引用为
\1

re.sub('<p>([A-Z]{2})', r'<i>\1', Mytext)
re.sub('([A-Z]{2}'),r'\1',Mytext)
\1
这里的意思是:替换为正则表达式中第一个
(…)
匹配的子字符串。()


注意替换字符串前面的前导
r
,使其成为原始字符串。

使用前瞻断言的另一种方法:

re.sub(r'<p>(?=[A-Z]{2,})','<i>',MyText)
re.sub(r'(?=[A-Z]{2,}'),,MyText)