Python Regex查找不完整的左括号和右括号

时间:2019-05-15 15:17:04

标签: python regex python-3.x

我正在尝试查找不完整的左括号和右括号。以下是示例。

"[[lang:foreign]"  "[lang:foreign]]"  "[[beep"  "[beep"  "hello]"  "lang:foreign]"

我尝试了多种正则表达式,例如:

\[([^()]|(?R))*\] Or
[^\[*(\[.*\))[^\]]* Or just
\W\s?\W

我知道他们都不会上班。

我的主要目标是找到一个不完整的括号,例如[beep or [[beep or beep],然后在其前面添加一个特殊的识别字符。 看起来像#specialC#[beep or #specialC#[[beep or #specialC#beep]

1 个答案:

答案 0 :(得分:1)

不使用正则表达式,这似乎更容易(尽管可能有一种更有效的方法)。

将字符串转换为字符列表(以简化循环时的字符替换),保留开括号索引值的列表,找到匹配的右括号时从列表中删除开括号索引值,替换之前遇到的所有右括号相应的左括号,在检查了整个字符串之后,替换索引值列表中剩余的所有右括号,然后加入列表以返回包含替换后的字符值的字符串。

def unmatched(s):
    chars = list(s)
    opened = []
    for i, c in enumerate(chars):
        if c == '[':
            opened.append(i)

        if c == ']':
            if not opened:
                chars[i] = ']*UNMATCHED*'
            else:
                opened.pop()

    for i in opened:
        chars[i] = '*UNMATCHED*['

    return ''.join(chars)

示例输出:

d = ['[[lang:foreign]', '[lang:foreign]]', '[[beep', '[beep', 'hello]', 'lang:foreign]']
for s in d:
    print(unmatched(s))

# *UNMATCHED*[[lang:foreign]
# [lang:foreign]]*UNMATCHED*
# *UNMATCHED*[*UNMATCHED*[beep
# *UNMATCHED*[beep
# hello]*UNMATCHED*
# lang:foreign]*UNMATCHED*