字符串末尾的非贪婪Python正则表达式
我需要在Python3中搜索一个字符串,但从末尾开始实现非贪婪逻辑时遇到了问题 我试着用一个例子来解释: 输入可以是以下内容之一字符串末尾的非贪婪Python正则表达式,python,regex,python-3.x,Python,Regex,Python 3.x,我需要在Python3中搜索一个字符串,但从末尾开始实现非贪婪逻辑时遇到了问题 我试着用一个例子来解释: 输入可以是以下内容之一 test1 = 'AB_x-y-z_XX1234567890_84481.xml' test2 = 'x-y-z_XX1234567890_84481.xml' test3 = 'XX1234567890_84481.xml' 我需要找到字符串的最后一部分,以 somestring\u otherstring.xml 在上述所有情况下,正则表达式应返回XX1234
test1 = 'AB_x-y-z_XX1234567890_84481.xml'
test2 = 'x-y-z_XX1234567890_84481.xml'
test3 = 'XX1234567890_84481.xml'
我需要找到字符串的最后一部分,以
somestring\u otherstring.xml
在上述所有情况下,正则表达式应返回XX1234567890_84481.xml
我的最佳尝试是:
result = re.search('(_.+)?\.xml$', test1, re.I).group()
print(result)
在这里,我使用:
(u.+)?
在非贪婪模式下匹配“_anystring”
\.xml$
匹配字符串最后部分的“.xml”
我得到的输出不正确:
_x-y-z_XX1234567890_84481.xml
我发现一些问题()解释正则表达式从左边开始,即使是非贪婪限定符
有谁能从右边解释一下如何实现一个非贪婪的正则表达式吗?您需要使用这个正则表达式来捕获您想要的内容
[^_]*_[^_]*\.xml
看看这段Python代码
import re
arr = ['AB_x-y-z_XX1234567890_84481.xml','x-y-z_XX1234567890_84481.xml','XX1234567890_84481.xml']
for s in arr:
m = re.search(r'[^_]*_[^_]*\.xml', s)
if (m):
print(m.group(0))
印刷品
XX1234567890_84481.xml
XX1234567890_84481.xml
XX1234567890_84481.xml
正则表达式中的问题是,(\u+)?\.xml$
部分将从第一个(\u+)?
开始匹配,并将匹配任何内容,直到它看到一个文本。xml
,并且整个部分也是可选的,因为后面跟着?
。由于字符串\u x-y-z_XX1234567890_84481.xml
,它还将匹配\u x-y-z_XX1234567890_84481
,这不是您想要的正确行为。您的模式(\u+)?\.xml$
在可选组中捕获第一个下划线,直到它可以匹配字符串末尾的.xml
,并且它不考虑应介于之间的下划线数量
要仅匹配最后一部分,可以省略捕获组。您可以使用一个否定字符类,并使用锚点$
断言行的结尾,因为它是最后一部分:
[^_]+_[^_]+\.xml$
|
那会匹配的
不匹配1+次_[^33;]+
逐字匹配\
不匹配1+次_[^33;]+
- 字符串末尾的
Match.xml\.xml$
import re
test1 = 'AB_x-y-z_XX1234567890_84481.xml'
result = re.search('[^_]+_[^_]+\.xml$', test1, re.I)
if result:
print(result.group())
不确定这是否符合您在概念上所寻找的“非贪婪自右”——但这种模式给出了正确的答案:
'[^_]+_[^_]+\.xml$'
[^\u]
是一个字符类,它与任何非下划线的字符匹配。为什么它应该匹配\u XX1234567890\u 84481.xml
而不是\u 84481.xml
?它是在最后一个下划线之前的最后一个之后吗?它不应该匹配_XX1234567890_84481.xml,也不应该匹配_84481.xml,但只有XX1234567890_84481.xml我可能使用了错误的字符串,但我要让它们清楚,为什么它应该匹配XX1234567890_84481.xml
而不是84481.xml
?