如何使用任何字符匹配以及可选的匹配模式?

时间:2019-05-15 08:23:00

标签: python regex

我有此输入,名称&cp_name(,10)

我的要求是,

  • 开始不应该是一个空格
  • 'name'应该与任何chracter(。+)匹配,因为它可以是任何东西
  • “&cp_name”(可选)
  • '()'括号内的任何内容都可以(可选)

注意:这三个都可以用一个或多个空格分隔

    (?P<field>[^\s].+?)\s*(?P<col>[&][a-zA-Z_]+)?\s*(?P<pos>\(.*?\))?

我在python中尝试过的正则表达式 我希望与3个被捕获的小组进行一场比赛

  • 字段->名称
  • col->&cp_name
  • pos->(,10)

我得到了2个匹配项

第一场比赛:

  • field->'na'

第二场比赛:

  • field->'me'
  • col->'&cp_name'
  • pos->'(,10)'

1 个答案:

答案 0 :(得分:0)

对于字段组,您可以先不匹配空格字符,然后再匹配任何非空格字符。

由于字段组可以包含空格,因此您可以重复该操作,并确保单词不以&开头或以括号开头和结尾。

^(?P<field>(?![^\s&]*&)\S+(?: (?!\([^)]*\)|[^&\s]*&)\S+)*)\s*(?P<col>&[a-zA-Z_]+)?\s*(?P<pos>\(.*?\))?$
  • ^字符串的开头
  • (?P<field>命名组字段
    • (?![^\s&]*&)\S+断言右边的内容不包含&,然后匹配1倍以上的非空格字符
    • [^\s&]\S+不匹配空格字符或&,然后匹配1倍以上的非空格字符
    • (?:非捕获组
      • (?!\([^)]*\))\S+断言右边的内容不是( ... ),然后匹配1+倍非空格字符
    • )*关闭非捕获组并重复0次以上
  • )关闭组字段
  • \s*(?P<col>&[a-zA-Z_]+)?匹配可选的col
  • \s*(?P<pos>\(.*?\))?匹配可选的pos

Regex demo

请注意,您可以省略[&]周围的方括号