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

我有一个简单的代码,它使用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

在正则表达式中,你不需要担心起始字符串是什么,除非你想匹配它。在您的情况下,不需要在使用占位符之前编写
*

因此,您可以使用如下所示的正则表达式:

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