如何在 Python 中选择正则表达式模式

How to choose a regex pattern in Python

我正在学习 Python 3,但我正在努力使用 re 模块获取正则表达式。

这是我的问题:我有字符串

phrase = "s000000000 s1133122 s21 s3 s4 s5212638476234857634 s6 s7 s8 s9000"

并且,使用函数

re.findall(pattern, phrase)

我要提取:

  1. 没有附加字符的 s0-s9 字符串;
  2. 没有附加字符的 s0-s3 个字符串;
  3. 带有附加字符的 s0-s3 个字符串;
  4. 带有附加字符的 s4-s9 字符串。

我使用以下模式成功完成了前三项任务:

  1. pattern = "s[0-9]"
  2. pattern = "s[0-3]"
  3. pattern = "s[0-3]+"

不过,对于最后一个任务,我尝试复制我在第三个任务中所做的并使用了

pattern = "s[4-9]+"

但是,不是得到结果

["s4", "s5212638476234857634", "s6", "s7", "s8", "s9000"]

我明白了

["s4", "s5", "s6", "s7", "s8", "s9"]

这是为什么?我错过了什么?我正在学习的书上的说明指出加号表示“一个或多个字符”,并且 s[0-3]+ 模式实际上有效,但我无法使其适用于这个特定问题。

你需要使用

s[4-9]\d*

regex demo注意:如果 s 前面不应有任何单词字符 \bs[4-9]\d*,您可能希望从单词边界开始匹配。在 Python 中,它看起来像 r'\bs[4-9]\d*'

详情:

  • s - 一个 s 字符
  • [4-9] - 从 49
  • 的数字
  • \d* - 零个或多个数字。

参见Python demo

import re
rx = r"s[4-9]\d*"
text = "s000000000 s1133122 s21 s3 s4 s5212638476234857634 s6 s7 s8 s9000"
print( re.findall(rx, text) )
# => ['s4', 's5212638476234857634', 's6', 's7', 's8', 's9000']