【问题标题】:Regex to match strings within braces正则表达式匹配大括号内的字符串
【发布时间】:2017-09-15 16:28:21
【问题描述】:

我正在尝试将正则表达式写入具有以下格式的字符串

12740(34,12) [abc (a1b2c3) (a2b3c4)......] myId123

目前,我有这样的东西

\((?P<expression>\S+)\)

但是有了这个,我只能捕获方括号内的字符串。

无论如何我可以捕获方括号之前的整数,以及末尾的 id 以及方括号内的字符串。

小括号内的字符串数量将不相同。我也可以有一个看起来像这样的字符串

10(3,2) [abc (a1b2c3)] myId1

我知道我可以使用蛮力为上述表达式编写一个简单的正则表达式。但是当方括号内的字符串数量不断变化时,谁能帮我写一个。

提前致谢

【问题讨论】:

  • 您不能使用带有re 的单个正则表达式来捕获任意数量的组。匹配中的组数与模式中定义的组数一样多。
  • @WiktorStribiżew 哦,删除..!!
  • @WiktorStribiżew 这是对每个“使用正则表达式解析 HTML/XML”问题的欺骗(无论 OP 是否意识到)。我们是否没有规范的“Regex/CFG”问题来结束这些问题?也许我们应该。
  • @JaredSmith:这与 HTML/XML 解析无关。可以使用带有 PyPi regex 库的单个正则表达式来完成。
  • @WiktorStribiżew 匹配任意嵌套的平衡分组字符?还是我误解了 OP 想要什么?

标签: python regex


【解决方案1】:

您可以使用^$来捕获信息,分别表示开始和结束:

((?P<front>^\d+)|\((?P<expression>\S+)\)|(?P<id>[a-zA-Z0-9]+)$)

正则表达式101:

https://regex101.com/r/PoA5k4/1

为了让结果更有用,我会把它变成字典:

import re

myStr = "12740(34,12) [abc (a1b2c3) (a2b3c4)......] myId123"
di = {}
for find in re.findall("((?P<front>^\d+)|\((?P<expression>\S+)\)|(?P<id>[a-zA-Z0-9]+)$)",myStr):
    if find[1] != "":
        di["starter"] = find[1]
    elif find[3] != "":
        di["id"] = find[3]
    else:
        di.setdefault("expression",[]).append(find[2])
print(di)

【讨论】:

  • 这绝对有帮助。非常感谢您的回答。
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
相关资源
最近更新 更多