编写正则表达式以匹配传入的聊天

时间:2016-09-30 09:12:56

标签: regex

我正在尝试编写一个正则表达式(在Python中)来匹配来自用户的输入。 我试图从输入中获取“名称”和“数字”。

当前正则表达式:

^(?P<start_number>\d+){0,1} (?P<name>.+)|^(?P<name2>.+?)(?:\s+){0,1}(?P<end_number>\d+){0,1}$

输入是:

  1. foo 1
  2. foo 2不捕获此文本
  3. 3 foo
  4. 4 foo捕获此文
  5. foo 1 2 3
  6. 我想要捕获的内容:

    1. name:foo,num:1
    2. name:foo,num:2
    3. name:foo,num:3
    4. name:foo捕获此文本,数字:4
    5. name:foo,num:1
    6. 我的问题是,由于“$”它显然不适用于2或5.但如果我删除“$”它只捕获1,2,5的字符串的第一个字母

      有什么想法吗?我正在使用regex101来帮助我

      由于

1 个答案:

答案 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+字符,直到行的其余部分
  • $ - 字符串结尾

An online test

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