【问题标题】:re find date in string在字符串中重新查找日期
【发布时间】:2018-07-31 08:04:42
【问题描述】:

有人能解释一下如何使用 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)

非常感谢!

【问题讨论】:

  • 你应该看看the doc for re,你可以看看regex101.com交互式地测试正则表达式。
  • 这简直太完美了……这个在线正则表达式测试器!谢谢!

标签: python string findall


【解决方案1】:

字符串的 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

【讨论】:

  • 谢谢朋友!你教会了我很多!并且您的解决方案正在运行!
【解决方案2】:

所以这里发生了两件事

1) 当你输入一些文本"..." 它首先需要被python解释器解释
2)然后python解释器将结果result("...")传递给它自己的内部正则表达式解释器

为了匹配像数字这样的特殊字符,python 的内部正则表达式解释器支持像\d 这样的特殊字符。所以正则表达式解释器期望得到\d。不幸的是,字符\ 也是python 解释器的转义字符。

为了避免 python 解释器吃掉\ 并且只将d 传递给正则表达式解释器。我们把r"..."放在我们的字符串前面表示一个“原始字符串”——意思是“嘿python解释器,不要碰我的\字符!”

【讨论】:

  • 非常感谢。你们所有人都帮助了我,我学到了一些新东西。
【解决方案3】:

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

Python 将\ 描述为:

转义特殊字符(允许您匹配诸如 '*'、'?' 等字符),或发出特殊序列的信号;

基本上意味着,如果您使用通常是特殊字符的字符来进行正则表达式,它会忽略这一点。

{} 用于重复:

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

意味着它将重复上一个字符,您在{}中指定的数字

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

我强烈推荐你this tutorial

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

【讨论】:

  • 非常感谢。你们所有人都帮助了我,我学到了一些新东西。
猜你喜欢
  • 2012-04-09
  • 2011-09-27
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多