【问题标题】:How to search/extract patterns in a string?如何在字符串中搜索/提取模式?
【发布时间】:2019-05-22 06:17:52
【问题描述】:
我想在我的消息中搜索一个模式。
模式是:
1. "aaa-b3-c"
2. "a3-b6-c"
3. "aaaa-bb-c"
我知道如何搜索其中一种模式,但如何搜索所有 3 种模式?
另外,您如何识别和提取以下格式的日期:5/21 或 5/21/2019。
found = re.findall(r'.{3}-.{2}-.{1}', message)
【问题讨论】:
标签:
python
regex
regex-lookarounds
regex-group
regex-greedy
【解决方案1】:
试试这个:
found = re.findall(r'a{2,4}-b{2}-c', message)
【解决方案2】:
你可以使用
a{2,4}-bb-c
作为一种模式。
现在您需要检查匹配的真实性:
match = re.search(pattern, string)
if match:
# do sth. here
从Python 3.8 开始,您可以使用walrus 运算符
if (match := re.search(pattern, string)) is not None:
# do sth. here
【解决方案3】:
试试这个:
re.findall(r'a.*-b.*-c',message)
【解决方案4】:
第一部分可以是量词 {2,4} 而不是 3。点匹配除换行符以外的任何字符,[a-zA-Z0-9] 将匹配大写或小写字符 a-z 或数字:
\b[a-zA-Z0-9]{2,4}-[a-zA-Z0-9]{2}-[a-zA-Z0-9]\b
Demo
如果字符不应成为较长单词的一部分,您可以在任一侧添加单词边界 \b 或锚点 ^ 和 $。
对于第二个模式,您还可以使用 \d 和一个量词来匹配一个数字和一个可选的模式来匹配带有 / 和 4 个数字的部分:
\d{1,2}/\d{2}(?:/\d{4})?
Regex demo
请注意,格式不会验证日期本身。也许this page 可以帮助您创建/自定义更具体的日期格式。
【解决方案5】:
在这里,我们可能只想写三个表达式,并从左到右滑动我们的输入以确保安全,并使用逻辑 OR 将它们连接起来,如果我们有更多模式,我们可以简单地添加到它,类似于:
([a-z]+-[a-z]+[0-9]+-[a-z]+)
([a-z]+[0-9]+-[a-z]+[0-9]+-[a-z])
([a-z]+-[a-z]+-[a-z])
这将添加到:
([a-z]+-[a-z]+[0-9]+-[a-z]+)|([a-z]+[0-9]+-[a-z]+[0-9]+-[a-z])|([a-z]+-[a-z]+-[a-z])
然后,我们可能想用开始和结束字符来绑定它:
^([a-z]+-[a-z]+[0-9]+-[a-z]+)$|^([a-z]+[0-9]+-[a-z]+[0-9]+-[a-z])$|^([a-z]+-[a-z]+-[a-z])$
或
^(([a-z]+-[a-z]+[0-9]+-[a-z]+)|([a-z]+[0-9]+-[a-z]+[0-9]+-[a-z])|([a-z]+-[a-z]+-[a-z]))$
正则表达式
如果不需要此表达式,可以在 regex101.com 中修改或更改它。
正则表达式电路
jex.im 可视化正则表达式: