gpt4 book ai didi

python re,查找包含可选组的表达式

转载 作者:太空宇宙 更新时间:2023-11-03 13:46:47 26 4
gpt4 key购买 nike

我有一个正则表达式可以有来自:

(src://path/to/foldernames canhave spaces/file.xzy)
(src://path/to/foldernames canhave spaces/file.xzy "optional string")

这些表达式出现在一个更长的字符串中(它们不是单独的字符串)。使用 re.searchre.findall 时,我无法匹配两个表达式(因为字符串中可能有多个表达式)。

它很简单,可以单独匹配任何一种情况,但我如何才能匹配任何一种情况,以便返回两组,第一组是 src://path/...,第二组是可选字符串(如果存在)或None(如果不存在)?

我在想我需要以某种方式指定 OR 组——例如,考虑:

模式 \((.*)( ".*")\) 匹配第二个实例但不匹配第一个实例,因为它不包含 "..."

r = re.search(r'\((.*)( ".*")\)', '(src://path/to/foldernames canhave spaces/file.xzy)'
r.groups() # Nothing found
AttributeError: 'NoneType' object has no attribute 'groups'

虽然 \((.*)( ".*")?\) 匹配第一组但不单独将 “可选字符串” 标识为一个组在第二种情况下。

r = re.search(r'\((.*)( ".*")?\)', '(src://path/to/foldernames canhave spaces/file.xzy "optional string")')
r.groups()
('src://path/to/foldernames canhave spaces/file.xzy "optional string"', None)

有什么想法吗,你们这些(常规的)表达大师?

最佳答案

最简单的方法是制作第一个* non-greedy :

>>> import re
>>> string = "(src://path/to/foldernames canhave spaces/file.xzy)"
>>> string2 = \
... '(src://path/to/foldernames canhave spaces/file.xzy "optional string")'
>>> re.findall(r'\((.*?)( ".*")?\)', string2)
[('src://path/to/foldernames canhave spaces/file.xzy', ' "optional string"')]
>>> re.findall(r'\((.*?)( ".*")?\)', string)
[('src://path/to/foldernames canhave spaces/file.xzy', '')]

关于python re,查找包含可选组的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18420156/

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