regex 从花括号内提取整个单词,这样嵌套的花括号就被忽略[关闭]

kb5ga3dv  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(142)

已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。

2天前关闭。
Improve this question
样品输入:

x = r"\color{{aqua}}{{text}}"

样本输出:

x = ["aqua", "text"]

我们忽略花括号的嵌套是至关重要的。
如果您将嵌套花括号视为树数据结构的规范,那么我们只需要树的叶节点。
也许正则表达式,比如\{[A-Za-z]\}会对我们有所帮助。

lndjwyie

lndjwyie1#

您可以将re.findall与以下任何正则表达式一起使用:

  • (?<=\{)[^{}]+(?=\})
  • \{([^{}]+)\}
>>> s = "\color{{aqua}}{{text}}"
>>> re.findall(r'(?<=\{)[^{}]+(?=\})',s)
['aqua', 'text']
>>> re.findall(r'\{([^{}]+)\}',s)
['aqua', 'text']

第一个正则表达式使用查找圆来匹配任何东西,除了花括号,由一对花括号包围。
第二个匹配花括号的内容与大括号本身,但由于只有一个组存在findall将只包含该组的内容,而不是完全匹配。

gzszwxb4

gzszwxb42#

一些正则表达式就可以了。

import re
x = r"\color{{aqua}}{{text}}"
matches = re.finditer('\{+(.*?)\}+', x)

list_of_findings = []
for match in matches:
    list_of_findings.append(match.group(1))

print(list_of_findings)

输出:

['aqua', 'text']

请注意,正则表达式\{+(.*?)\}+意味着找到一个或多个左花括号\{+},然后将后面的内容分组为我想要提取的部分(.*?),前提是后面跟着一个或多个右花括号\}+(.*?)中的问号使匹配不贪婪。如果它是贪婪的,那么它匹配的是'{{aqua}}{{text}}'而不是'{{aqua}}'。finditer创建了一个可迭代对象,你可以通过循环来获取每个匹配。最后match.group(0)给出了匹配{{agua}}{{text}},而www.example www.example.com (1)给出了我想提取aquatext的部分。
请参阅Python regex documentation

相关问题