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
为什么不是';Python中的正则表达式是否工作不正常?_Python_Regex - Fatal编程技术网

为什么不是';Python中的正则表达式是否工作不正常?

为什么不是';Python中的正则表达式是否工作不正常?,python,regex,Python,Regex,我有一个.txt文件(带有一种XML代码),我正在尝试重新构造它。我有两个问题,关于事情没有按我希望的方式进行(这两个问题都已通过Wiktor的评论得到解决)。 该文件如下所示: <str name="name">John</str> <date name="year">2021</date> <arr name="food"> <str>Pizza</

我有一个.txt文件(带有一种XML代码),我正在尝试重新构造它。我有两个问题,关于事情没有按我希望的方式进行(这两个问题都已通过Wiktor的评论得到解决)。

该文件如下所示:

<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)