我正在尝试查找不完整的左括号和右括号。以下是示例。
"[[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]
答案 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*