如何在re模块中正确使用占位符?

时间:2018-03-17 04:36:15

标签: python regex

我有这个使用python re module的占位符的简单代码..

(?P<name>...)

我的目标是在“/”字符之前获取值(数字)。值的长度可以是4,依此类推......

我在下面写了这段代码。

import re

s = "hello world 1234/book"
x = r"^h.*(?P<test>[0-9].*)/.*$"

y = re.search(x, s)
print y.group('test')

但它只会返回:

>>> 4

我理想的结果是:

>>> 1234

我真的很感激任何提示。

3 个答案:

答案 0 :(得分:1)

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

所以你可以像下面这样使用正则表达式:

s = "hello world 1234/book"
re.search(r'(?P<text>[0-9].*)/.*$', s).group(1)  # '1234'

答案 1 :(得分:0)

如果您需要在"/"字符之前获取值(数字),则可以使用regex

import re
s = "hello world 1234/book"
y = re.search(r"^h.*?(?P<test>[0-9].*)/.*$", s)
print(y.group('test'))
# 1234

或者只是没有占位符:

import re
s = "hello world 1234/book"
y = re.search(r"([0-9]+)/.*", s)
print(y.group(1))
# 1234

答案 2 :(得分:0)

首先,您的问题与占位符或命名组没有任何关系;你做的那部分就好了。要验证这一点,请尝试将每个部分捕获为未命名的组并打印出您得到的内容:

>>> s = "hello world 1234/book"
>>> x = r"(^h.*)([0-9].*)(/.*$)"
>>> y = re.search(x, s)
>>> print(y.groups())
('hello world 123', '4', '/book')

请参阅?对于您关心的群体,您获得的完全相同'4'

打印出所有组通常是对正在发生的事情的有益测试。要获得更好的测试,请使用众多在线正则表达式调试器中的一个,它可以突出显示匹配并向您解释。例如,regex101显示(通过着色)^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')

现在您可以删除不需要的组,并将名称恢复为您想要的名称。