可以在套装中使用插入符号和前瞻符号吗?

时间:2013-05-18 15:11:21

标签: python regex

我已经阅读了文档并在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"

我希望捕获组捕获空格和短划线,但是如果它前面有空格(或者如果后面是空格,假设前瞻与后观),则不捕获短划线。

1 个答案:

答案 0 :(得分:1)

有两个问题。

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

  2. 字符类中的前瞻字符不是特殊 - 它们被视为文字字符。你的角色类r'[^\s(?=\-)]'相当于r'[^\-)(?\s=]',意思是“匹配除=,?,(,空格和\和之间的所有字符)之外的每个字符”。

  3. 对于您似乎要尝试的操作,尝试匹配除短划线以外的每个字符,并使用替换来获取不以空格开头的短划线:

    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中找到。