gpt4 book ai didi

python - 正则表达式匹配或条件与 '|' 不工作

转载 作者:行者123 更新时间:2023-12-05 01:22:57 25 4
gpt4 key购买 nike

我有一些示例文本如下:

MTG-2022039036 MTG
MTG-LR 3136 / 130 MTG
MTG-LR 201260 / 9046 ASSIGN
MTG-2021063349 MTG

我想要的结果:

2022039036
3136 / 130
201260 / 9046
2021063349

我的正则表达式模式单独工作很好示例:

match1 = re.search(r'(\d+ \/ ?\d+)', ref)
num1 = match1.group(1) if match1 else None
# correctly returns 3136 / 130

match2 = re.search(r'(?:-?)(\d+)', ref)
num2 = match2.group(1) if match2 else None
# correctly returns 2021063349

但我想将它们组合成一行,如下所示,以匹配一种或另一种模式,因为每个字符串中只会出现一种情况:

match = re.search(r'(?:-?)(\d+)|(\d+ \/ ?\d+)', ref)
num = match.group(1) if match else None
# This only returns 3136

我觉得我在做一件非常简单的事情,但不知道为什么现在这行不通了。我用过'|'用于匹配 pandas str.extract() 中的任一个或条件并且在那里没有问题。请指教。

最佳答案

/ 之后似乎没有可选空格,但您可以使用单个模式:

\b\d+(?: / ?\d+)?\b

解释

  • \b 防止部分单词匹配的单词边界
  • \d+ 匹配1+个数字
  • (?:/?\d+)? 可选地匹配 / 然后是一个可选的空格和 1+ 位数字
  • \b 单词边界

Regex demo

import re

pattern = r"\b\d+(?: / ?\d+)?\b"

s = ("MTG-2022039036 MTG\n"
"MTG-LR 3136 / 130 MTG \n"
"MTG-LR 201260 / 9046 ASSIGN\n"
"MTG-2021063349 MTG")

print(re.findall(pattern, s))

输出

['2022039036', '3136 / 130', '201260 / 9046', '2021063349']

或者使用匹配前导 MTG- 和可选 LR 的捕获组,其中第 1 组值将由 re.findall

返回
\bMTG-(?:LR )?(\d+(?: / \d+)?)\b

解释

  • \bMTG- 按字面匹配前导词边界
  • (?:LR )? 可选地匹配 LR
  • ( 捕获组 1
    • \d+(?:/\d+)? 可选地匹配 / 然后是可选的空格和 1+ 位数字
  • ) 关闭组 1
  • \b 单词边界

Regex demo

关于python - 正则表达式匹配或条件与 '|' 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73123079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com