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']
发生什么事了?你知道吗
您可以使用
r"(\w+[\s\b]+\w+)"
,意思是:\w+
=一个单词;[\s\b]
=空格或单词边界:Debuggex Demo
您将自己与实际定义的字符类混淆,
[1-6]
将匹配范围1
和6
之间的单个字符。您可能是指{1,6}
,它将在1
和6
次之间匹配前面的regex标记,称为range操作符。你知道吗在第二次尝试中,通过在字符类
[1-6]
前面使用*
操作符,您告诉regex引擎匹配前面的标记“零次或更多次”,这最终会单独匹配每个单词字符,因为您的字符串中没有数字字符。你知道吗相反,您可以简单地将regex编写为:
你似乎把
{1,6}
和[1-6]
混淆了,前者意味着“之前的模式重复了1到6次”,后者意味着“在1
到6
范围内的任何字符”。你知道吗那么,你有什么:
Debuggex Demo
…将匹配一个单词字符,后跟1-6之间的数字。你知道吗
把
*
放在末尾只意味着数字模式中的0或更多,这意味着任何单词字符后面都跟有1-6中的0或更多数字。你知道吗但是如果你使用正确的语法,你会得到你想要的:
Debuggex Demo
相关问题 更多 >
编程相关推荐