如何修改现有Regex表达式以忽略括号中的单词

2024-09-29 22:30:02 发布

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

我有以下代码

listnew= ['E-Textbooks','Dynamic', 'Case', 'Management', '(', 'DCM', ')']. 
nounbreak = list(itertools.chain(*[re.findall(r"\b\w+\b(?![\(\w+\)])", i) for i in listnew]))

而上面的代码成功地删除了“-”甚至“/”。不知怎的,它不能忽略括号里的词

理想的输出是

['E', 'Textbooks','Dynamic', 'Case', 'Management']

如何调整上述正则表达式本身以呈现上述所需的输出?你知道吗


Tags: 代码inrechainfordynamicmanagementlist
2条回答

您的问题是regex单独查看每个list元素—它无法“看到”在它查看的当前元素之前/之后有"("")"元素。你知道吗

我建议事先清理你的名单:

import re
from itertools import chain

listnew = ['E-Textbooks','Dynamic', 'Case', 'Management', '(', 'DCM', ')'] 

# collect indexes of elements that are ( or ) or things between them
# does not work for ((())) - you might need to do something more elaborate
# if that can happen
remove = []
for i,k in enumerate(listnew):
    if k == "(":
        remove.append(i)
    elif k != ")" and remove and i == remove[-1]+1 and remove[-1] != ")":
        remove.append(i)
    elif k == ")":
        remove.append(i)

data = [k for i,k in enumerate(listnew) if i not in frozenset(remove)]


# did not touch your regex per se - you might want to simplify it using regex101.com
nounbreak =  list(chain(*[re.findall(r"\b\w+\b(?![\(\w+\)])", i) for i in data]))

print(nounbreak)

输出:

['E', 'Textbooks', 'Dynamic', 'Case', 'Management']

如果您只有简短的列表-您也可以' '.join(..)它们并清除括号内的字符串-请参阅f.e.Regular expression to return text between parenthesis了解如何完成此操作并将其从字符串中删除。你知道吗

这是一个仅演示正则表达式的稀疏解决方案。
基本上是在非单词上加入数组,在本例中是逗号,然后
使用findall在其上运行正则表达式。
括号元素将是可以过滤的空字符串
通过列表压缩。你知道吗

正则表达式:

   \( .*? \) 
|  \b
   ( \w+ )                       # (1)
   \b

Python代码:

>>> import re
>>> list_orig = ['E-Textbooks','Dynamic', 'Case', 'Management', '(', 'DCM', ')']
>>> str = ','.join( list_orig )
>>> list_new = re.findall( r"\(.*?\)|\b(\w+)\b", str )
>>> list_new = [i for i in list_new if i]
>>> print( list_new )
['E', 'Textbooks', 'Dynamic', 'Case', 'Management']

相关问题 更多 >

    热门问题