使用regex解析字符串

2024-09-29 21:53:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一根绳子

txt = 'text1 & ("text2" | "text3" | "text4") & "text5" ! (text6 | text7 | text8)'

假设我想解析它,这样我就得到了括号之间的元素。我的图案看起来像

pattern = '\(([^\)(]+)\)'

使用python,我得到了两个组

>>> print re.findall(pattren, text)
['"text2" | "text3" | "text4"', 'text6 | text7 | text8']

假设我们想找到像

>>> print re.findall(magic_pattren, text )
['& ("text2" | "text3" | "text4")', '! (text6 | text7 | text8)']

任何关于magic_pattren的猜测。我可以使用字符串操作来获得所需的输出

 >>> print [txt[str.find(txt, a)-3: 1+len(a)+str.find(txt, a)] for a in re.findall(pattren, txt)]
 ['& ("text2" | "text3" | "text4")', '! (text6 | text7 | text8)']

但这感觉有点笨拙,如果括号组是在开始时就失败了。我可以加上一个检查,但就像我说的感觉有点笨重。有人要吗


Tags: textretxtmagic括号printstrfindall
1条回答
网友
1楼 · 发布于 2024-09-29 21:53:04

您可以在模式的开头使用(?:\B\W\s*)?可选组:

import re
p = re.compile(r'(?:\B\W\s*)?\([^()]+\)')
test_str = "(text9 & text10) & text1 & (\"text2\" | \"text3\" | \"text4\") & \"text5\" ! (text6 | text7 | text8)"
print(p.findall(test_str))

结果sample demo['(text9 & text10)', '& ("text2" | "text3" | "text4")', '! (text6 | text7 | text8)']

(?:\B\W\s*)?是一个非捕获组(因此值不会在结果中输出),可以重复一次或零次(由于最后的?),并且它只匹配非单词字符(\W),前提是它前面有一个非单词字符或字符串开头(\B),后面有0+空格

Here is the regex demo

相关问题 更多 >

    热门问题