为什么不是';Python中的正则表达式是否工作不正常?
我有一个.txt文件(带有一种XML代码),我正在尝试重新构造它。我有两个问题,关于事情没有按我希望的方式进行(这两个问题都已通过Wiktor的评论得到解决)。 该文件如下所示:为什么不是';Python中的正则表达式是否工作不正常?,python,regex,Python,Regex,我有一个.txt文件(带有一种XML代码),我正在尝试重新构造它。我有两个问题,关于事情没有按我希望的方式进行(这两个问题都已通过Wiktor的评论得到解决)。 该文件如下所示: <str name="name">John</str> <date name="year">2021</date> <arr name="food"> <str>Pizza</
<str name="name">John</str>
<date name="year">2021</date>
<arr name="food">
<str>Pizza</str>
<str>Meat</str>
</arr>
p.sub
行上的新结构可能不完全正确,但这不是问题:如果我使用p.sub('test',content)
,并且我在代码末尾打印content
,匹配项也不会被'test'
替换。内容和开始时一样。所以,整个函数似乎不起作用。我做错了什么?此网站对正则表达式很有帮助:
我不是正则表达式方面的专家,但我认为添加/n参数是必要的,类似于您检查0+通配符的方式
已编辑:\n(.)\n
你可以试试吗?再说一遍,我不是正则表达式专家。只是想伸出援助之手。您需要通过添加
re.S
或re.DOTALL
标志来确保模式跨行匹配,*
必须使用惰性点*?
使*非贪婪,并且您需要确保关闭标记与打开标记相同(通过内联反向引用). 另外,不要忘记需要将re.sub
的结果赋给一个变量,因为字符串在Python中是不可变的
你需要使用
p=compile(r'(.*),re.I|re.S)
content=p.sub(r'\3',content)
看
详细信息
子字符串
(.*)
-第3组:尽可能少的任何零个或多个字符
-
re.sub
返回新值,使用content=p.sub('\\3',content)
。但是您需要r'(?s)(.*?)
regex。请参阅文档,它不是XML文件。它只是一个包含错误结构化XML数据的.txt文件。但是它是一个.txt文件,所以我们可以这样对待它谢谢@WiktorStribiżew,问题二已经解决了!:)您是否尝试过p=compile(r'(.*),re.I | re.S)
+content=p.sub(r'\3',content)
?是的,我已经开始怀疑了。但这不起作用(我这样试过:(.*\n*)),但没用。也尝试了你的正则表达式,但那不能提供匹配。但是,威克托的第二句话解决了这个问题。我不能理解它的作用,但它是有效的。无论如何,谢谢你的帮助!:)太好了,非常感谢你的帮助和很好的解释!
<name>John</name>
<year>2021</year>
<food>
Pizza
Meat
</food>
<(str|date|arr|int|long).*="(.+)">(.*)</(str|date|arr|int|long)>
from re import compile
file = open("file.txt")
content = file.read()
p = compile('<(str|date|arr|int|long).*="(.+)">(.*)</(str|date|arr|int|long)>')
p.sub('<\\2>\\3</\\2>', content)
print(content)