从逻辑表达式

时间:2015-07-14 10:27:21

标签: python regex

假设我有一个看起来像这样的字符串:

myStr = '(Txt_l1 (Txt_l2)) or (Txt2_l1 (Txt2_l2))'

我最终想要获得的是:

myStr_l1 = '(Txt_l1) or (Txt2_l1)'

myStr_l2 = '(Txt_l2) or (Txt2_l2)'

一些属性:

  • 所有“Txt _” - 字符串的元素以大写字母开头

  • 字符串可以包含更多元素(因此也可能有Txt3Txt4,...)

  • 后缀'_l1'和'_l2'在现实中看起来不同;它们不能用于匹配(我选择它们用于演示目的)

我找到了一种方法来完成第一部分:

myStr_l1 = re.sub('\(\w+\)','',myStr)

给了我

'(Txt_l1 ) or (Txt2_l1 )'

但是,我不知道如何获得myStr_l2。我的想法是删除两个开括号之间的所有内容。但是,当我做这样的事情时:

re.sub('\(w+\(', '', myStr)

返回整个字符串。

re.sub('\(.*\(', '', myStr)

删除 - 当然 - 太多了,给了我

'Txt2_l2))'

有没有人知道如何获得myStr_l2

当有“和”而不是“或”时,字符串看起来略有不同:

myStr2 = '(Txt_l1 (Txt_l2) and Txt2_l1 (Txt2_l2))'

然后我仍然可以使用上面的命令:

re.sub('\(\w+\)','',myStr2)

给出:

'(Txt_l1  and Txt2_l1 )'

但我再次未能获得myStr2_l2。我如何为这些字符串执行此操作?

然后如何使用“和”和“或”例如对混合表达式执行此操作。像这样:

myStr3 = '(Txt_l1 (Txt_l2) and Txt2_l1 (Txt2_l2)) or  (Txt3_l1 (Txt3_l2) and Txt4_l1 (Txt2_l2))' 

re.sub('\(\w+\)','',myStr3)

给了我

'(Txt_l1  and Txt2_l1 ) or  (Txt3_l1  and Txt4_l1 )'

但又一次:我如何获得myStr3_l2

2 个答案:

答案 0 :(得分:0)

Regexp对于嵌套表达式来说不够强大(在您的情况下:括号中的嵌套元素)。你必须编写一个解析器。看https://pyparsing.wikispaces.com/

答案 1 :(得分:0)

我不完全确定你想要什么但是我写了这个以去除括号之间的所有东西。

import re

mystr = '(Txt_l1 (Txt_l2)) or (Txt2_l1 (Txt2_l2))'
sets = mystr.split(' or ')
noParens = []
for line in sets:
    mat = re.match(r'\((.* )\((.*\)\))', line, re.M)
    if mat:
        noParens.append(mat.group(1))
        noParens.append(mat.group(2).replace(')',''))
print(noParens)

这将取消所有括号并将您的元素放入列表中。这是另一种不使用正则表达式的方法。

mystr = '(Txt_l1 (Txt_l2)) or (Txt2_l1 (Txt2_l2))'
noParens = []

mystr = mystr.replace(' or ', ' ')
mystr = mystr.replace(')','')
mystr = mystr.replace('(','')
noParens = mystr.split()

print(noParens)