我正在尝试编写一个正则表达式,以确保根据规范正确地重新格式化“标签”。 (我正在更新一堆旧东西。)
一般的想法是,标签可以在 ()
或 []
中包含括号内容。但是,现有标签可能格式不正确:
- 好:
示例(样本)
示例 [示例]
- 不好:
样本((样本)
示例 [(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/