Skip to content

正则表达式

遇到的问题

匹配可选内容时

如匹配时分秒,可能会没有秒时,正常的正则书写为 \d{1,2}:\d{1,2}(:\d{1,2})? 使用 search 而后 group 可以找到,但使用 findall 则无法找到,需要改为 \d{1,2}:\d{1,2}(?::\d{1,2})? 增加 ?: 前缀。具体说明解释参看官方文档「非捕获和命名组」。(下方实例也可参考)

实践

简单匹配

匹配中文 [\u4e00-\u9fa5]
匹配英文 [a-zA-Z]
匹配数字 [0-9]

匹配 字母+空格+汉字,形如”a 好“,[a-zA-Z] [\u4e00-\u9fa5]
那么如果只匹配符合这个格式的空格呢?

正则表达式匹配空行、空白行

两种方法

  • ^(\t)*$\n
  • /^\s*$/

python 提取字符串中的指定字符

py
def match_strings(text, begin, end):
    pattern = re.compile(f'{begin}(.*?){end}')
    matches = pattern.findall(text)
    return matches

如果 字符串里有 \n 记得替换掉 否则不生效

提取日期

py
import re
# single match
find_des = '2024/6/25 18:00—2024/7/16 14:59\n\n'
time_match = re.search(
    r"(\d{4}/\d{1,2}/\d{1,2}\s+\d{1,2}:\d{1,2}(:\d{1,2})?)", find_des
)
if time_match:
    time = time_match.group(1)
else:
    time = None
print(time)
py
def find_date(text):
    # 正则表达式匹配两种格式的时间字符串
    # 2024/1/2 or 2024/01/02 or 2024-01-02
    # 秒可选,可能会没有秒
    # (?::\d{1,2})?
    # 参考 群友 及 https://docs.python.org/3/howto/regex.html#non-capturing-and-named-groups
    pattern = r"\d{4}[/-]\d{1,2}[/-]\d{1,2}\s+\d{1,2}:\d{1,2}(?::\d{1,2})?"
    matches = re.findall(pattern, text)
    unique_matches = list(dict.fromkeys(matches))
    return unique_matches

吃好喝好 快乐地活下去