【问题标题】:Python Regex to find incomplete opening and closing bracketsPython Regex 查找不完整的左括号和右括号
【发布时间】:2019-05-15 15:17:04
【问题描述】:

我试图找出不完整的左括号和右括号。以下是示例。

"[[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]

【问题讨论】:

  • 这不是您应该尝试使用正则表达式解决的问题
  • 括号(打开或关闭)总是一起出现吗?另外,您能判断您提供的测试用例是正面还是负面?
  • @AshwinGeetD'Sa 我有这个大的 json 文件,它包含完整的标签,如 [文本],但有些不完整,如 [文本或文本]。我的测试用例是否定的。谢谢!
  • 看看这是否适用于您的问题 [+.?]+
  • 这些被称为“不平衡括号”或“不平衡括号”,找到它们是common coding challenge

标签: python regex python-3.x


【解决方案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*

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多