我有这个使用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
我真的很感激任何提示。
答案 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')
现在您可以删除不需要的组,并将名称恢复为您想要的名称。