Python 如何在re模块中正确使用占位符?
我有一个简单的代码,它使用python re模块的占位符Python 如何在re模块中正确使用占位符?,python,regex,Python,Regex,我有一个简单的代码,它使用python re模块的占位符 (?P<name>...) 我的理想结果是: >>> 1234 我非常感谢您的任何提示。如果您需要在“/”字符前面获取值(数字),您可以使用正则表达式,如下所示: import re s = "hello world 1234/book" y = re.search(r"^h.*?(?P<test>[0-9].*)/.*$", s) print(y.group('test')) # 1234
(?P<name>...)
我的理想结果是:
>>> 1234
我非常感谢您的任何提示。如果您需要在
“/”字符前面获取值(数字),您可以使用正则表达式,如下所示:
import re
s = "hello world 1234/book"
y = re.search(r"^h.*?(?P<test>[0-9].*)/.*$", s)
print(y.group('test'))
# 1234
在正则表达式中,你不需要担心起始字符串是什么,除非你想匹配它。在您的情况下,不需要在使用占位符之前编写*
因此,您可以使用如下所示的正则表达式:
s = "hello world 1234/book"
re.search(r'(?P<text>[0-9].*)/.*$', s).group(1) # '1234'
s=“你好,世界1234/本书”
再搜索(r'(?P[0-9].*)/.$',s).组(1)#'1234'
首先,您的问题与占位符或命名组无关;你做得很好。要验证这一点,请尝试将每件作品捕获为一个未命名的组,并打印出您得到的内容:
>>> s = "hello world 1234/book"
>>> x = r"(^h.*)([0-9].*)(/.*$)"
>>> y = re.search(x, s)
>>> print(y.groups())
('hello world 123', '4', '/book')
看到了吗?对于您所关心的组,您将获得完全相同的'4'
打印出所有的组通常是对正在发生的事情的一个有用的测试。为了更好的测试,可以使用许多在线regex调试器中的一个,它可以突出显示匹配项并向您解释它们。例如,(通过着色)显示^h.*
与hello world 123
匹配,即使不更改正则表达式使其更易于调试
无论如何,您现有正则表达式的问题是,第一个*
将尽可能匹配,同时允许模式的其余部分工作,这意味着它将匹配'hello world 123'
,正如您上面所看到的,而不仅仅是'hello world'
如果要切换图案的贪婪程度,请在末尾添加一个?
:
>>> s = "hello world 1234/book"
>>> x = r"(^h.*?)([0-9].*)(/.*$)"
>>> y = re.search(x, s)
>>> print(y.groups())
('hello world ', '1234', '/book')
现在,您可以删除不需要的组,并将名称还原为需要的组。尝试使用类似于x=r“^h.*?(?p[0-9].*)/.$”的方法。
。注意第一个*
@dcg之后的?
,哇。那奏效了。。谢谢。我假设他使用^h.*
的原因是他的正则表达式打算拒绝任何不以h
开头的字符串,而您的正则表达式将接受此类字符串。(当然,我可能是错的,也许他毫无理由地把它放在那里,但我不会从这个假设开始。)虽然他没有提到它的用途,但为什么他会把h
放在那里呢?当然,它与他的搜索字符串的第一个字符匹配,这不仅仅是愚蠢的运气吗?一开始,人们可能会使用所有被探索的东西,一旦解决了,我们会在检查效果时稍微删除,即使在我开始编写代码的时候,我也使用了一些不必要的代码,但在学习后对其进行了改进,因此我们不能假设为什么会有这样的代码,也不能根据猜测来编写答案,而是用户提出的问题,而您的答案是猜测。您猜测h
是没有原因的,因此可以在不破坏所需语义的情况下丢弃它。如果您解释您正在这样做(而且您也在这样做),那么这可能没问题,但需要明确的是,您正在改变他的正则表达式的功能,而不仅仅是使组匹配1234
,而不是4
。
s = "hello world 1234/book"
re.search(r'(?P<text>[0-9].*)/.*$', s).group(1) # '1234'
>>> s = "hello world 1234/book"
>>> x = r"(^h.*)([0-9].*)(/.*$)"
>>> y = re.search(x, s)
>>> print(y.groups())
('hello world 123', '4', '/book')
>>> s = "hello world 1234/book"
>>> x = r"(^h.*?)([0-9].*)(/.*$)"
>>> y = re.search(x, s)
>>> print(y.groups())
('hello world ', '1234', '/book')