有人可以解释如何使用re.find all仅将日期与以下字符串分开吗?当日期可以是格式-1.1.2001或11.11.2001时。字符串中有不等的数字,表示天和月 -
import re
str = "This is my date: 1.1.2001 fooo bla bla bla"
str2 = "This is my date: 11.11.2001 bla bla foo bla"
我知道我应该使用re.findall(pattern,string)但说实话我对这些模式完全感到困惑。我不知道如何组装模式以适应我的情况。
我发现了类似的东西,但我绝对不知道为什么在模式之前有r字母... \表示字符串的开头? d表示数字? {}中的数字表示多少?
match = re.search(r'\d{2}.\d{2}.\d{4}', text)
非常感谢!
答案 0 :(得分:2)
字符串的r
前缀告诉Python解释器它是raw string,这实质上意味着反斜杠\
不再被视为转义字符,而是字面反斜杠。对于re
模块,它很有用,因为反斜杠被大量使用,所以为了避免大量\\
(逃避反斜杠),大多数人会使用原始字符串。
您正在寻找的是:
match = re.search(r'\d{1,2}\.\d{1,2}\.\d{4}', text)
{}
告诉正则表达式你想要的前一组的出现次数。 {1,2}
表示最小值为1,最大值为2 \d
,{4}
表示4次出现的完全匹配。
请注意,.
也会被\.
转义,因为正则表达式.
表示任何字符,但在这种情况下,您正在寻找文字.
所以你逃避它以告诉正则表达式寻找文字字符。
有关详细说明,请参阅此处:https://regex101.com/r/v2QScR/1
答案 1 :(得分:0)
所以这里有两件事情
1)当你输入一些文本"..."
时,它首先需要由python解释器解释
2)然后python解释器将结果result("...")
传递给它自己的内部正则表达式解释器
为了匹配像数字这样的特殊字符,python的内部正则表达式解释器支持\d
之类的特殊字符。因此正则表达式解释器期望获得\d
。不幸的是,字符\
也是python解释器的转义字符。
为了避免python解释器吃掉\
并且只将d
传递给正则表达式解释器。我们将r"..."
放在字符串前面以表示“原始字符串” - 这意味着“嘿python解释器,不要触摸我的\
字符!”
答案 2 :(得分:0)
使用r
是raw string,这意味着它不会被字符串中的\
转义或更改
Python将\
描述为:
要么转义特殊字符(允许您匹配'*','?'等字符),要么发出特殊序列信号;
基本上意味着如果你使用通常是regex特殊字符的字符,它就会忽略它。
{}
用于重复:
使得到的RE匹配前一个RE的m到n次重复,尝试匹配尽可能少的重复。这是前一个限定符的非贪婪版本。例如,在6个字符的字符串'aaaaaa'上,{3,5}将匹配5'a'字符,而{3,5}?只会匹配3个字符。
这意味着它会在{}
\d
是一个特殊字符,匹配0到9之间的任何数字。
我强烈推荐你this tutorial
re.findall()
返回使用该正则表达式匹配的所有内容的列表。