字符串末尾的非贪婪Python正则表达式

字符串末尾的非贪婪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

我需要在Python3中搜索一个字符串,但从末尾开始实现非贪婪逻辑时遇到了问题

我试着用一个例子来解释:

输入可以是以下内容之一

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

那会匹配的

  • [^33;]+
    不匹配1+次_
  • \
    逐字匹配
  • [^33;]+
    不匹配1+次_
  • 字符串末尾的
    \.xml$
    Match.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