找出一个字符串中两边只有一个括号的所有子串
Find all the substrings in a string that only have a single bracket on both sides
我试图在一个字符串中找到两边只有一个括号的所有子字符串。
示例:'(pop((hello world))(goodbye(now))(hi)jump)'
我想得到这个列表:['(hi)', '(pop((hello world))(goodbye(now))(hi)jump)']
因为它们是唯一两边都有一个括号的子串。
(像 '(now))(hi)jump)'
这样的子字符串不计算在内,因为它们不完整).
我的代码在这里:
import re
l = '(M264/M274)+(((551/882)+362/(362/551/882)+889)/((551/882)+362/(362/551/882)+889)+(241/242/275/550/551+882/889/362))'
print(re.findall(r"[^\(.](\([^\(.].*?[^\).]\))[^\).]", l))
将return:
['(362/551/882)', '(362/551/882)']
我不确定如何让它包含 (M264/M274)
。
请帮助我。
使用否定字符 class,如 [^\(.]
和 [^\).]
匹配字符 class 中未列出的任何字符,并且至少需要一个字符。这部分 。*?可以匹配除换行符以外的任何字符,所以它也可以匹配括号。
它不考虑平衡括号,但如果您想像问题中那样匹配 (M264/M274)
,您可以将环视与 negated character class
结合使用
(?<!\()\([^()]+\)(?!\))
部分
(?<!\()
负向后视,断言左边的不是 (
\(
匹配 (
[^()]+
匹配除 (
或 )
之外的任何字符
\)
匹配 )
(?!\))
否定前瞻,断言右边不是`)
如果你想匹配 2 个左括号和右括号,你也可以使用 lookarounds 并注意这也没有考虑平衡括号。
(?<!\()\(\((?!\().*?\)\)(?<!\)..)(?!\))
部分(使用相同的机制或环顾四周,只是这次使用 .*?
(?<!\()
负向后视,断言左边的不是 (
\(\(
匹配 ((
(?!\))
否定前瞻,断言右边不是`)
.*?
匹配除换行符以外的任何字符 0+ 次
\)\)
匹配 ))
(?<!\)..)
否定后视,在 ))
之前断言不是 )
(?!\))
否定前瞻,断言右边不是`)
我试图在一个字符串中找到两边只有一个括号的所有子字符串。
示例:'(pop((hello world))(goodbye(now))(hi)jump)'
我想得到这个列表:['(hi)', '(pop((hello world))(goodbye(now))(hi)jump)']
因为它们是唯一两边都有一个括号的子串。
(像 '(now))(hi)jump)'
这样的子字符串不计算在内,因为它们不完整).
我的代码在这里:
import re
l = '(M264/M274)+(((551/882)+362/(362/551/882)+889)/((551/882)+362/(362/551/882)+889)+(241/242/275/550/551+882/889/362))'
print(re.findall(r"[^\(.](\([^\(.].*?[^\).]\))[^\).]", l))
将return:
['(362/551/882)', '(362/551/882)']
我不确定如何让它包含 (M264/M274)
。
请帮助我。
使用否定字符 class,如 [^\(.]
和 [^\).]
匹配字符 class 中未列出的任何字符,并且至少需要一个字符。这部分 。*?可以匹配除换行符以外的任何字符,所以它也可以匹配括号。
它不考虑平衡括号,但如果您想像问题中那样匹配 (M264/M274)
,您可以将环视与 negated character class
(?<!\()\([^()]+\)(?!\))
部分
(?<!\()
负向后视,断言左边的不是(
\(
匹配(
[^()]+
匹配除(
或)
之外的任何字符
\)
匹配)
(?!\))
否定前瞻,断言右边不是`)
如果你想匹配 2 个左括号和右括号,你也可以使用 lookarounds 并注意这也没有考虑平衡括号。
(?<!\()\(\((?!\().*?\)\)(?<!\)..)(?!\))
部分(使用相同的机制或环顾四周,只是这次使用 .*?
(?<!\()
负向后视,断言左边的不是(
\(\(
匹配((
(?!\))
否定前瞻,断言右边不是`).*?
匹配除换行符以外的任何字符 0+ 次\)\)
匹配))
(?<!\)..)
否定后视,在))
之前断言不是 (?!\))
否定前瞻,断言右边不是`)
)