【问题标题】:Regex: capturing all text between multiple curly braces and anything following the last curly brace正则表达式:捕获多个大括号之间的所有文本以及最后一个大括号之后的任何内容
【发布时间】:2022-02-04 23:19:36
【问题描述】:

我有如下文本行:

() \\span{figurato} di \\span{qualcuno} scream loudly

我需要从中捕获注释“figurato”、“qualcuno”以及“scream loudly”字符串。 换句话说,我需要捕获花括号中包含的每个术语(称为注释,从 1 到 N 的可变数字)但 还要捕获一个字符串,其中包含最后一个右花括号之后的任何内容.

我的正则表达式适用于第一个任务:

{(?P<annotation>.+?)}

我还有第二个任务的正则表达式:

[^}]+$

当前有效的python代码是:

def _scanGloss(gloss: str) -> dict:
    return {"gloss": re.search(r"[^}]+$", gloss), "annotations": re.findall(r"{(?P<annotation>.+?)}", gloss)}

其中光泽是输入行,但我没有成功找到一种方法来仅在一个正则表达式中完成所有这些操作。有可能吗?

作为第二种模式的附带问题,我无法使用括号来定义捕获组,但这并不重要。

谢谢

【问题讨论】:

  • 你为什么不 OR 你的 2 个正则表达式来得到 1 个?
  • 感谢您的建议,但使用 OR 我怎么知道哪个是哪个?

标签: python regex


【解决方案1】:

解释。

  • 我们找到\\span{
  • 第一个命名组注释 (?P&lt;annotation&gt;[^}]+)(除} 之外的任何字符)
  • 跳过空格\s+
  • 第二个命名组gloss(?P&lt;gloss&gt;(?:\s*[\w]+)*)(这里我们找的是空格加单词)末尾没有空格
import re

str='\\span{figurato} di \\span{qualcuno} scream loudly'

regex=re.compile(r"\\span{(?P<annotation>[^}]+)}\s+(?P<gloss>(?:\s*[\w]+)*)")

[m.groupdict() for m in regex.finditer(str)]

输出

[ {'annotation': 'figurato', 'gloss': 'di'}, 
{'annotation': 'qualcuno', 'gloss': 'scream loudly'} ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-02
    • 2016-08-22
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2012-05-14
    相关资源
    最近更新 更多