Python Regex 替换 - 是否可以进行有条件的替换?

标签 python regex

我正在尝试编写一个正则表达式,以确保根据规范正确地重新格式化“标签”。 (我正在更新一堆旧东西。)

一般的想法是,标签可以在 ()[] 中包含括号内容。但是,现有标签可能格式不正确:

  • 好:
    • 示例(样本)
    • 示例 [示例]
  • 不好:
    • 样本((样本)
    • 示例 [(sample]]

我目前正在用一系列正则表达式处理这个问题,但我想知道在技术上是否可以用一个正则表达式来处理。

在代码的简化版本中...

RE_tag_collapse = re.compile(\
    """
        ([\[\(])+               ### opening bracket
            \s*
            (                   # the contents
                [^\]\)]+
            )
            \s*
        ([\]\)])*               # closing bracket
    """
    ,
    re.I | re.VERBOSE
)
edited= re.sub( RE_tag_collapse , r'\1\2\1' , tag )

此正则表达式的问题在于结束标记(第二个 \1)与开始标记相同。

我想要做的是将结束标记映射为开始标记的反面:

  • ( 反转为 )
  • [ 反转为 ]

有谁知道这是否容易可行?在我看来,最好的解决方案是保持原样并使用多个正则表达式。

最佳答案

如果我正确理解您的问题,您需要确保标签中的括号匹配。据我所知,python 中的正则表达式无法计算出现次数。但是,您可以使用一个函数来检查括号是否匹配,如下所示:

def check_tag(tag):
    charstack = []
    for c in tag:
        if c in ["(","]"]:
            charstack.append(c)
        else if c in [")","]"]:
            popped = charstack.pop()
            if not ((c == ")" and popped == "(" ) or (c == "]" and popped == "[")):
                return False
    return len(charstack) == 0

此函数的工作方式是,每次找到左括号时,都会将其压入堆栈。每次遇到右括号时,它都会将一个元素压出堆栈以查看它们是否匹配。如果他们不这样做,则标签格式不正确。

关于Python Regex 替换 - 是否可以进行有条件的替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12223134/

相关文章:

python - 获取对当前异常的引用

python - 基于 django 模型中的子组在 SQL 中进行插值

regex - 如何使用正则表达式提取键值对?

regex - mod_rewrite:用破折号替换下划线

python - 使用 scipysolve_ivp 在时间步之间运行代码

python - 如何以正确的顺序获取 pandas 中 value_counts() 的返回值

python - 在 matplotlib 文本框中对齐 LaTeX 数学文本

c# - 解析正则表达式时出错

c# - System.Net.MailMessage 允许一些无效的电子邮件地址格式

java - 用于验证 64 位(8 字节)MAC 地址的正则表达式?