如何替换';在python中,s不包含在带有regex的标记中

如何替换';在python中,s不包含在带有regex的标记中,python,regex,substring,Python,Regex,Substring,我有句子。 text=“美国总统是巴拉克·奥巴马。他出生于1961年8月4日。奥巴马于2012年11月连任总统。” 我想在“Obama”中添加标签,因此结果如下: 美国总统是巴拉克·奥巴马。他出生于1961年8月4日。2012年11月,奥巴马再次当选总统 我想找到子字符串(例如:Obama),子字符串之前没有标记,子字符串之后也没有标记,但我不知道python中正则表达式的正确语法。 **我是python新手:“” 使用简单正则表达式re.sub(namedEntity,“+namedEntit

我有句子。

text=“美国总统是巴拉克·奥巴马。他出生于1961年8月4日。奥巴马于2012年11月连任总统。”

我想在“Obama”中添加
标签,因此结果如下:
美国总统是巴拉克·奥巴马。他出生于1961年8月4日。2012年11月,奥巴马再次当选总统

我想找到子字符串(例如:Obama),子字符串之前没有标记
,子字符串之后也没有标记
,但我不知道python中正则表达式的正确语法。
**我是python新手:“”

使用简单正则表达式
re.sub(namedEntity,“+namedEntity+”,text)
将给出一个输出
美国总统是巴拉克·奥巴马。他出生于1961年8月4日。奥巴马于2012年11月连任总统。

这是我的代码(使用python2.7)

重新导入
结果=re.sub(r“(?!).*”+namedEntity+“*(?!)”,“+namedEntity+”,text)
打印“结果:+结果”
输出
结果:奥巴马

我不知道这是第一个“奥巴马”还是第二个


感谢您之前的帮助

您已经非常接近了。在新的正则表达式
r”((?!).*“+namedEntity+”*(?!)”
中,前后都有
*
,将“Obama”与其前后的任何字符进行匹配,并且由于标记位于匹配的组中,因此将忽略查找框。如果你移除它们,你就会得到你想要的结果

>>> import re
>>> text = "The president of America is <PERSON>Barack Obama</PERSON>. He was born on August 4, 1961. Obama was reelected president in November 2012"
>>> namedEntity = 'Obama'
>>> result = re.sub(r"((?!<PERSON>)"+namedEntity+"(?!</PERSON>))","<PERSON>"+namedEntity+"</PERSON>",text)
>>> print result
'The president of America is <PERSON>Barack Obama</PERSON>. He was born on August 4, 1961. <PERSON>Obama</PERSON> was reelected president in November 2012'
>>重新导入
>>>text=“美国总统是巴拉克·奥巴马。他出生于1961年8月4日。奥巴马于2012年11月连任总统”
>>>namedEntity=‘奥巴马’
>>>结果=re.sub(r“(?!)”+namedEntity+“(?!)”,“+namedEntity+”,text)
>>>打印结果
美国总统是巴拉克·奥巴马。他出生于1961年8月4日。2012年11月,奥巴马再次当选总统

对于将来的正则表达式测试,regex101可以很好地检查在您更改它们时如何工作。因为你的案子说明了发生了什么

只需删除regex lookarounds中的
*
部分

>>>text="The president of America is <PERSON>Barack Obama</PERSON>. He was born on August 4, 1961. Obama was reelected president in November 2012"
>>> surname=re.search(r'<PERSON>(.*)</PERSON>', text).group(1).split()[1]
>>> print surname
Obama
>>> re.sub(r'(?<!<PERSON>)'+surname+'(?!</PERSON>)', '<PERSON>'+surname+'</PERSON>', text)'  
The president of America is <PERSON>Barack Obama</PERSON>. He was born on August 4, 1961. <PERSON>Obama</PERSON> was reelected president in November 2012'
>>> 
>>text=“美国总统是巴拉克·奥巴马。他出生于1961年8月4日。奥巴马于2012年11月再次当选总统。”
>>>姓氏=重新搜索(r'(.*),文本).group(1.split()[1]
>>>打印姓氏
奥巴马
>>>re.sub(r'(?)'+姓氏+'(?!)',“+姓氏+”,文本)
美国总统是巴拉克·奥巴马。他出生于1961年8月4日。2012年11月,奥巴马再次当选总统
>>> 

注意:您还可以使用regex提取此人的姓氏,并捕获我在
姓氏
变量中捕获的组。你可以使用
(?)来断言负向后看,使用
(?!regex)
来断言负向前看

你是从什么地方复制代码的吗?你知道你在这个正则表达式中做什么吗?我通过从这个答案中学习来尝试正则表达式。也许我错了,因为我认为?!正则表达式的意思是“不包含正则表达式”:''不应该是
(?)
,即
反向查找
?我实际上在那里被搞糊涂了。@noob,我不这么认为。你想忽略已经有标记的匹配项。只是为了证明这是正确的答案(+1).是吗?!还有?@KhusnaNadia,没错,这取决于名字周围的标签。
>>>text="The president of America is <PERSON>Barack Obama</PERSON>. He was born on August 4, 1961. Obama was reelected president in November 2012"
>>> surname=re.search(r'<PERSON>(.*)</PERSON>', text).group(1).split()[1]
>>> print surname
Obama
>>> re.sub(r'(?<!<PERSON>)'+surname+'(?!</PERSON>)', '<PERSON>'+surname+'</PERSON>', text)'  
The president of America is <PERSON>Barack Obama</PERSON>. He was born on August 4, 1961. <PERSON>Obama</PERSON> was reelected president in November 2012'
>>>