在字符串

时间:2018-02-20 20:57:52

标签: python string findall

有人可以解释如何使用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)

非常感谢!

3 个答案:

答案 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)

使用rraw string,这意味着它不会被字符串中的\转义或更改

Python将\描述为:

  

要么转义特殊字符(允许您匹配'*','?'等字符),要么发出特殊序列信号;

基本上意味着如果你使用通常是regex特殊字符的字符,它就会忽略它。

{}用于重复:

  

使得到的RE匹配前一个RE的m到n次重复,尝试匹配尽可能少的重复。这是前一个限定符的非贪婪版本。例如,在6个字符的字符串'aaaaaa'上,{3,5}将匹配5'a'字符,而{3,5}?只会匹配3个字符。

这意味着它会在{}

中指定的数字重复前一个字符

\d是一个特殊字符,匹配0到9之间的任何数字。

我强烈推荐你this tutorial

re.findall()返回使用该正则表达式匹配的所有内容的列表。