如何使用任何字符匹配后跟可选的匹配模式?

2024-09-28 01:30:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个输入,name&cp\u name(,10)

我的要求是

  • 开始不应该是空格
  • “name”应该与任何chracter(+)匹配,因为它可以是任何字符
  • “&;cp\u名称”(可选)
  • “()”括号中可以有任何内容(可选)

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

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

我在python中尝试的正则表达式 我希望有一场比赛有3个被抓获的小组

  • 字段->;名称
  • 列->;&cp\u名称
  • 位置->;(,10)

我得到的是2根火柴

第一场比赛:

  • 字段->;“na”

第二场比赛:

  • 字段->;“我”
  • 列->;'&;cp\u名称'
  • 位置->;'(,10)'

Tags: nameposgt名称field内容小组col
1条回答
网友
1楼 · 发布于 2024-09-28 01:30:34

对于字段组,可以先匹配非空白字符,然后再匹配任何非空白字符。你知道吗

因为字段组可以包含空格,所以可以重复这一点,并确保单词不以&开头或以左括号和右括号开头。你知道吗

^(?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

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

相关问题 更多 >

    热门问题