繁体   English   中英

如果在子字符串之间提取数据,否则提取完整字符串

[英]Extract data if between substrings else full string

我有这样的字符串模式:

Beginning through June 18, 2022 at Noon standard time\n
Jan 20, 2022
Beginning through April 26, 2022 at 12:01 a.m. standard time

我想使用 python 正则表达式在“通过”之后和“at”字之前提取数据部分预设。

June 18, 2022
Jan 20, 2022
April 26, 2022

我可以使用 re group 提取长文本。

s ="Beginning through June 18, 2022 at Noon standard time"
re.search(r'(.*through)(.*) (at.*)', s).group(2)

但是它不适用于

s ="June 18, 2022"

任何人都可以帮助我。

您可以将此正则表达式与捕获组一起使用:

(?:.* through |^)(.+?)(?: at |$)

正则表达式演示

正则表达式详细信息:

  • (?:.* through |^) :匹配后面跟" though "或开始位置的任何内容
  • (.+?) :匹配任何字符的 1+ 并将其捕获到组 #1
  • (?: at |$) : 匹配" at "或字符串结尾

代码:

import re
arr = ['Beginning through June 18, 2022 at Noon standard time',
'Jan 20, 2022',
'Beginning through April 26, 2022 at 12:01 a.m. standard time']

for i in arr:
     print (re.findall(r'(?:.* through |^)(.+?)(?: at |$)', i))

输出:

['June 18, 2022']
['Jan 20, 2022']
['April 26, 2022']

如何玩可选组回溯

^(?:.*?through )?(.*?)(?: at.*)?$

请参阅 regex101 上的此演示或 tio.run 上Python 演示

请注意,如果仅存在一个子字符串,则它将从字符串的第一个到结尾匹配,或者从字符串的开头匹配到后者。 如果不存在,它将匹配完整的字符串。


另一个想法可能是使用支持分支重置组PyPI 正则表达式

^(?|.*?through (.+?) at|(.+))

如果两者都存在,则此部分提取,否则提取完整字符串。 Afaik regex模块与 Python 的 regex 函数广泛兼容,只需使用import regex as re代替。

regex101 的演示或 tio.run 的Python 演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM