Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.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
Python 重新更换&;带名称实体_Python_Regex - Fatal编程技术网

Python 重新更换&;带名称实体

Python 重新更换&;带名称实体,python,regex,Python,Regex,我必须用输入字符串中的名称实体或十进制实体替换&,但输入字符串可能包含其他名称,并且将出现&中的十进制实体 代码: import re text =' At&T, " < I am > , At&T so &#60; &lt; & & ' #- Get all name entities and decimal entities. replace_tmp = re.findall("&#\d+;|&[a-z]+;

我必须用输入字符串中的名称实体或十进制实体替换
&
,但输入字符串可能包含其他名称,并且将出现
&
中的十进制实体

代码

import re
text =' At&T, " < I am > , At&T  so  &#60; &lt; &  & '

#- Get all name entities and decimal entities.
replace_tmp = re.findall("&#\d+;|&[a-z]+;", text)

#- Replace above values from tempvalues.
tmp_dict = {}
count = 1
for i in replace_tmp:
    text = text.replace(i, "$%d$"%count)
    tmp_dict["$%d$"%count] = i
    count += 1


#- Replace & with &amp;
text = text.replace("&", "&amp;")

#- Replace tempvalues values with original.
for i in tmp_dict:
    text = text.replace(i, tmp_dict[i])

print text
重新导入
text='At&T,,At&T so<;&&'
#-获取所有名称实体和十进制实体。
替换_tmp=re.findall(&#\d++&[a-z]+;”,文本)
#-将上述值替换为临时值。
tmp_dict={}
计数=1
对于替换tmp中的i:
text=text.replace(i,“$%d$%count)
tmp_dict[“$%d$%count]=i
计数+=1
#-替换为&;
text=文本。替换(“&”、“&;”)
#-将临时值替换为原始值。
对于tmp_目录中的i:
text=text.replace(i,tmp_dict[i])
打印文本
最终输出
At&;T,,At&;T so<&&

但是我能得到直接做上述事情的正则表达式吗?


py文件中的最后一行:

import re
text =' At&T, " < I am > , At&T  so  &#60; &lt; &  & '

#- Get all name entities and decimal entities.
replace_tmp = re.findall("&#\d+;|&[a-z]+;", text)

#- Replace above values from tempvalues.
tmp_dict = {}
count = 1
for i in replace_tmp:
    text = text.replace(i, "$%d$"%count)
    tmp_dict["$%d$"%count] = i
    count += 1


#- Replace & with &amp;
text = text.replace("&", "&amp;")

#- Replace tempvalues values with original.
for i in tmp_dict:
    text = text.replace(i, tmp_dict[i])

print text

value=re.sub(r'&(?)(#[0-9]+|[a-zA-Z]+;),“&;”,value)。替换(“,”)。替换(“,”),”)
使用带负前瞻的字符串替换

import re
text =' At&T, " < I am > , At&T  so  &#60; &lt; &  & '

text = re.sub(r'&(?![\w\d#]+?;)',"&amp;",text)
print text
重新导入
text='At&T,,At&T so<;&&'
text=re.sub(r'&(?![\w\d#]+?)',“&;”,text)
打印文本

使用带负前瞻的字符串替换

import re
text =' At&T, " < I am > , At&T  so  &#60; &lt; &  & '

text = re.sub(r'&(?![\w\d#]+?;)',"&amp;",text)
print text
重新导入
text='At&T,,At&T so<;&&'
text=re.sub(r'&(?![\w\d#]+?)',“&;”,text)
打印文本
>>导入re
>>>re.sub(r'&(?(#[0-9]+|\w+)','和','At&T,,At&T so和&&&&&&&&&)
“At&;T”,,At&;T so<&&;'
您可以对
\w+使用否定的前瞻断言(例如:
)和
#[0-9]+(适用于
#60;

因此,正则表达式是:

&(?(#[0-9]+|\w+)
否定前瞻断言确保既没有
#[0-9]+
\w+
之前和

您也可以使用
[a-zA-Z]+而不是
\w+

>>导入re
>>>re.sub(r'&(?(#[0-9]+|\w+)','和','At&T,,At&T so和&&&&&&&&&)
“At&;T”,,At&;T so<&&;'
您可以对
\w+使用否定的前瞻断言(例如:
)和
#[0-9]+(适用于
#60;

因此,正则表达式是:

&(?(#[0-9]+|\w+)
否定前瞻断言确保既没有
#[0-9]+
\w+
之前和


您也可以使用
[a-zA-Z]+而不是
\w+

您期望的输出是什么?期望的输出:
At&;T、 “,At&;T so<;&;
可能重复See Special@VivekSable使用负前瞻正如我在回答中所指出的,最好使用预定义函数,考虑您期望的输出是什么?预期输出:
At&;T,,At&;T so<&&可能重复的See特别是@VivekSable使用反向前瞻正如我的回答中所指出的,最好使用预定义函数,尽管
&
可以是任何地方,这只是一个测试用例
&
可以是任何地方,这只是一个测试用例,看起来是一样的替换(“,”,“,”,“,”,“,”,“,”,“,”,“,”,”,“,”,“,”,”,“,”,”,“,”,”,“,”,这是我最后的py行,看起来是一样的。
re.sub(r)&(?([0-9]+;[a-zA-Z]+),“,”,“,”,“,“,”,“,“,”,“,”和At&T,“,,At&T“so”&,”,60,”,“,“,“,”,这是我最后的py行