我正在尝试编写一个正则表达式(在Python中)来匹配来自用户的输入。 我试图从输入中获取“名称”和“数字”。
当前正则表达式:
^(?P<start_number>\d+){0,1} (?P<name>.+)|^(?P<name2>.+?)(?:\s+){0,1}(?P<end_number>\d+){0,1}$
输入是:
我想要捕获的内容:
我的问题是,由于“$”它显然不适用于2或5.但如果我删除“$”它只捕获1,2,5的字符串的第一个字母
有什么想法吗?我正在使用regex101来帮助我
由于
答案 0 :(得分:0)
我建议:
^(?:(?P<start_number>\d+) (?P<name>.+)|(?P<name2>.*?) ?(?P<end_number>\d+).*)$
请参阅regex demo
<强>详情:
^
- 字符串开头(?:(?P<start_number>\d+) (?P<name>.+)|(?P<name2>.*?) ?(?P<end_number>\d+).*)
- 与2个替代品中的1个匹配的非捕获组
(?P<start_number>\d+) (?P<name>.+)
- 1+位(组“start_number”),空格(可以替换为\s+
)以及捕获到组“name”中的换行序列以外的任何1个字符|
- 或(?P<name2>.*?) ?(?P<end_number>\d+).*
- 除了捕获到组“name2”中的换行符号之外的任何0 +字符,一个可选空格(看起来你也可以在这里使用\s*
)然后将1+个数字捕获到组中“end_number”,然后是任何0+字符,直到行的其余部分$
- 字符串结尾import re
s = ['foo 1',
"foo 2 don't capture this text",
'3 foo',
'4 foo capture this text',
'foo 1 2 3']
pat = r'^(?:(?P<start_number>\d+) (?P<name>.+)|(?P<name2>.*?) ?(?P<end_number>\d+).*)$'
for x in s:
m = re.search(pat, x)
if m and m.group("start_number"):
print("{0}, {1}".format(m.group("start_number"), m.group("name")))
elif m and m.group("end_number"):
print("{0}, {1}".format(m.group("end_number"), m.group("name2")))