regex 正则表达式被括号拆分,但不是所有括号

5lwkijsr  于 2023-02-25  发布在  其他
关注(0)|答案(4)|浏览(181)

我试图拆分一个包含左括号和右括号的字符串,但希望排除前面有子字符串的括号。在以下示例中:

a = 'abc (xyz pqr) qwe ew (kjlk asd) ue(aad) kljl'

我想有一个列表,如:

['abc', 'xyz pqr', 'qwe ew', 'kjlk asd', 'ue(aad)', 'kljl']

所以我想保留ue(aad)而不按(aad)拆分
我试过:

y = [x.strip() for x in re.split(r"[^ue()][()]", a) if x.strip()]
gg58donl

gg58donl1#

试试这个:

import re

a = 'abc (xyz pqr) qwe ew (kjlk asd) ue(aad) kljl'
y = [x.strip() for x in re.split(r' (\S*\(.*?\))', a) if x != '']
for i in range(len(y)):
    if y[i][0] == '(' and y[i][-1] == ')':
        y[i] = y[i].strip('()')

print(y)  # => ['abc', 'xyz pqr', 'qwe ew', 'kjlk asd', 'ue(aad)', 'kljl']

RegEx (\S*\(.*?\))将匹配任何括号和前面的任何字符串,然后循环从前面没有字符串的匹配项中删除周围的括号。

qv7cva1a

qv7cva1a2#

由于关键字在我的例子中总是已知的,我想删除所有的ue(.*?),并将它们保存在一个列表中,然后用括号分割,然后替换它们。这样我就可以分割嵌套的括号。类似于:

a = "abc (xyz pqr) qwe ew (kjlk asd) ue(aad) kljl"
ues = re.findall("ue\(.*?\)", a)
j = re.sub("(?<=ue)\(.*?\)", "", a)
y = [x.strip() for x in re.split(r"[()]", j) if x.strip()]
for i in y:
    if "ue" in i:
        print(re.sub("ue", ues.pop(0), i))
    else: 
        print(i)

**更新:**必须被忽略的括号会有一个子字符串粘在它上面,就像ue()一样,所以在前面加一个空格会忽略它们。

y = [x.strip() for x in re.split(r"[(?<=\s)][()]", a) if x.strip()]
jei2mxaa

jei2mxaa3#

对于示例数据,可以使用捕获组来保留拆分后的结果。在模式中,捕获除带括号部分前后的括号之外的非空白字符。
在列表解析中,首先检查x,然后可以再次测试x.strip()
请注意,这不考虑任何嵌套/平衡括号。

    • 说明**
  • ([^\s()]+\([^()]*\))捕获组1,在从(...)匹配之前匹配1+个非空白字符
  • |
  • (\([^()]*\)[^\s()]+)捕获组2,从(...)匹配后匹配1+个非空格字符
  • |
  • [()]()匹配

请参见Python demoregex101 demo

import re

pattern = r"([^\s()]+\([^()]*\))|(\([^()]*\)[^\s()]+)|[()]"
a = 'abc (xyz pqr) qwe ew (kjlk asd) ue(aad) kljl'

y = [x.strip() for x in re.split(pattern, a) if x and x.strip()]
print(y)

产出

['abc', 'xyz pqr', 'qwe ew', 'kjlk asd', 'ue(aad)', 'kljl']
2uluyalo

2uluyalo4#

这是一个奇怪的方式来完成这一点,但它的工作:

import re

a = "abc (xyz pqr) qwe ew (kjlk asd) ue(aad) kljl"

dissub=re.split("\)\s",a)
newlist=[]
for b in dissub:
    dasplit=re.split("\s\(",b)
    for c in dasplit:

        newlist.append(c)
i=0
while i<len(newlist):
    dacheck=re.search("\(",newlist[i])
    if dacheck:
        newlist[i]+=")"
    i+=1
print(newlist)

相关问题