Skip to main content
 首页 » 编程设计

python之可以在集合中使用插入符和前瞻吗

2025年05月04日21lonelyxmas

我已经阅读了文档并查看了其他问题,但我还没有找到答案。

是否可以在集合内使用前瞻,或者让前瞻成为集合内的补充?

我想创建一个匹配所有字符的集合,除了以空格开头的破折号。但是,如果只有一个空格后没有破折号,则应该匹配。

我在想这样的事情会起作用,但它没有:

r'[^\s(?=\-)]' 

前瞻在集合内部不起作用吗?如果没有,我该如何着手解决这个问题?

编辑以提供示例:

我一直在努力寻找一个更准确的替代方法

r'([^\-]*)\-(.*)' 

这是为了读取一行并将艺术家与标题分开。

应用 re.match(r'([^\-]*)\-(.*)', "artist - title") 应该产生:

group(1) = "artist" 
group(2) = "title" 

但是,如果艺术家姓名包含破折号,则会捕获字符串的错误部分。

例子:

re.match(r'([^\-]*)\-(.*)', "jay-z - title") 

会产生:

group(1) = "jay" 
group(2) = "z - title" 

我希望捕获组捕获空格和破折号,但如果破折号前面有空格则不捕获破折号(或者如果破折号后跟空格则不捕获破折号,假设前瞻与后视)。

请您参考如下方法:

有两个问题。

  1. 字符类指定匹配被搜索文本中的单个字符 的多种可能性。前瞻和后视断言围绕您要匹配的字符的条件,但不是该字符的部分。

  2. 先行字符在字符类中并不特殊 - 它们被视为文字字符。您的字符类 r'[^\s(?=\-)]' 等同于 r'[^\-)(?\s=]' 并且意味着“匹配除 =、?、(、空格以及\和 ) 之间的所有字符之外的所有字符”。

对于您似乎想要做的事情,请尝试匹配除破折号以外的每个字符,并使用交替来获取前面没有空格的破折号:

r'([^-]|(?<!\s-))' 

(在问题添加示例后编辑)

如果您相信 ' - ' 总是将艺术家与歌曲标题分开,并且总是在第一次出现时这样做,您可以只使用 split每个字符串上的方法,如下所示:

>>> "jay-z - title".split(' - ', 1) 
['jay-z', 'title'] 
>>> 'prince - purple rain'.split(' - ', 1) 
['prince', 'purple rain'] 
>>> 'prince - purple rain - a love-song'.split(' - ', 1) 
['prince', 'purple rain - a love-song'] 

split 接受一个要拆分的子字符串,以及一个可选的最大拆分数。 split 将源字符串拆分为 split 参数上的子字符串列表,并删除 split 参数。

指定最大拆分数 N 返回一个包含 N+1 个子字符串的列表,其中删除了拆分目标的前 N ​​个实例。拆分目标的任何后续实例都保留在原位。

split 默认为从左到右读取字符串,您可以使用 rsplit 获得从右到左读取字符串,它也支持maxsplit 可选参数:

>>> 'prince - purple rain - a love-song'.split(' - ', 1) 
['prince', 'purple rain - a love-song'] 
>>> 'prince - purple rain - a love-song'.rsplit(' - ', 1) 
['prince - purple rain', 'a love-song'] 

内置的字符串类型有很多功能,你可以在Python documentation中找到。 .