对常规表达感到困惑

2024-05-19 01:15:22 发布

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

import re
caps = "bottle caps/ soda caps/ pop caps"

regex = re.findall(r"\w[1-6]", caps)

print(regex)

输出为:

[]

但是如果我这么做

import re
caps = "bottle caps/ soda caps/ pop caps"

regex = re.findall(r"\w[1-6]*", caps)

输出为:

['b', 'o', 't', 't', 'l', 'e', 'c', 'a', 'p', 's', 's', 'o', 'd', 'a', 'c', 'a', 'p', 's', 'p', 'o', 'p', 'c', 'a', 'p', 's']

如何使其输出:

["bottle caps", "soda caps, "pop caps"]

我知道你们会推荐使用.split,但我想更了解正则表达式

我也试过这个:

import re
caps = "bottle caps/ soda caps/ pop caps"

regex = re.findall(r"\w[1-6]?\s*\w[1-3]*", caps)

print(regex)

输出:

['bo', 'tt', 'le', 'ca', 'ps', 'so', 'da', 'ca', 'ps', 'po', 'p c', 'ap']

发生什么事了?你知道吗


Tags: importrelebottlecapspopregexca
3条回答

您可以使用r"(\w+[\s\b]+\w+)",意思是:\w+=一个单词;[\s\b]=空格或单词边界:

import re
caps = "bottle caps/ soda caps/ pop caps"

output = re.findall(r"(\w+[\s\b]+\w+)", caps)
print output # ['bottle caps', 'soda caps', 'pop caps']

(\w+[\s\b]+\w+)

Regular expression visualization

Debuggex Demo

您将自己与实际定义的字符类混淆,[1-6]将匹配范围16之间的单个字符。您可能是指{1,6},它将在16次之间匹配前面的regex标记,称为range操作符。你知道吗

在第二次尝试中,通过在字符类[1-6]前面使用*操作符,您告诉regex引擎匹配前面的标记“零次或更多次”,这最终会单独匹配每个单词字符,因为您的字符串中没有数字字符。你知道吗

相反,您可以简单地将regex编写为:

>>> re.findall(r"\w+ \w+", caps)
['bottle caps', 'soda caps', 'pop caps']

你似乎把{1,6}[1-6]混淆了,前者意味着“之前的模式重复了1到6次”,后者意味着“在16范围内的任何字符”。你知道吗

那么,你有什么:

\w[1-6]

Regular expression visualization

Debuggex Demo

…将匹配一个单词字符,后跟1-6之间的数字。你知道吗


*放在末尾只意味着数字模式中的0或更多,这意味着任何单词字符后面都跟有1-6中的0或更多数字。你知道吗


但是如果你使用正确的语法,你会得到你想要的:

\w{1,6}

Regular expression visualization

Debuggex Demo

相关问题 更多 >

    热门问题