使用regex一次提取两个模式

2024-06-15 05:29:46 发布

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

我有一个字符串列表,每个字符串都有以下模式(一组单词,后跟括逗号分隔单词的括号):

"vw xy zz (X, Y, Z)"

我想要的输出是:

["vw xy zz", "X", "Y", "Z"]

我知道如何在括号前提取文本:

import re
pattern = r"(^[^\(]+)"
text = "vw xy zz (X, Y, Z)"
re.findall(pattern, text)
# ['vw xy zz ']

我还知道如何提取括号之间的文本:

pattern = r"\(.*\)"
text = "vw xy zz (X, Y, Z)"
re.findall(pattern, text)
# ['(X, Y, Z)']

但我想知道是否有一种方法可以将这些模式组合起来,一次获得所需的输出。你知道吗


Tags: 字符串text文本importre列表模式单词
3条回答

如果这些值不仅是字母数字,而且可能包含除空格和逗号以外的任何字符,我建议使用基于否定字符类的“generic”regex:

re.findall(r'[^(),\s](?:[^(),]*[^(),\s])?', s)

参见regex demo。你知道吗

不需要strip()返回所有匹配项的re.findall之后的项。你知道吗

细节

  • [^(),\s]-a negated character class匹配除(),和空白之外的任何字符
  • (?:[^(),]*[^(),\s])?-1或0次出现:
    • [^(),]*-除(),以外的任何字符
    • [^(),\s]-除了(),和空格之外的任何字符

const regex = /([a-zA-Z]{1,2}\s?){3}|[A-Z]/g const text = "vw xy zz (X, Y, Z)" const res = text.match(regex); console.log(res)

此正则表达式将匹配:["vw xy zz ", "X", "Y", "Z"]

你可以在这里测试regex tester

([a-zA-Z]{1,2}\s){3}|[A-Z]

您可以使用re.findall

s = "vw xy zz (X, Y, Z)"
result = [i.strip() for i in re.findall('[\w\s]+', s)]

输出:

['vw xy zz', 'X', 'Y', 'Z']

相关问题 更多 >