我已经阅读了文档并在SO上查找了其他问题,但我还没有找到答案。
是否可以在集合中使用前瞻,或者在集合中使用前瞻作为补充?
我想创建一个匹配每个字符的集合,除了前面有空格的短划线。但是,如果只有一个空格后面没有短划线,那么它应该是一个匹配。
我在想这样的事情会起作用,但事实并非如此:
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"
我希望捕获组捕获空格和短划线,但是如果它前面有空格(或者如果后面是空格,假设前瞻与后观),则不捕获短划线。
答案 0 :(得分:1)
有两个问题。
字符类指定了在搜索文本中匹配单个字符的多种可能性。前瞻和后瞻断言条件围绕你将匹配的角色,但不是该角色的部分。
字符类中的前瞻字符不是特殊 - 它们被视为文字字符。你的角色类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中找到。