确保正则表达式匹配不以短划线开头

时间:2015-12-02 05:55:06

标签: python regex

这个Python正则表达式可以匹配连续的数字:

\d{6,}(?=\D)(?![.@])|\d{6,}(?=$)

但我不希望比赛以-开头,例如:

  

010-12345678 =>无效

     

12345678 => 12345678

我该怎么做?

2 个答案:

答案 0 :(得分:2)

尝试 -

(?<!\d|-)\d{6,}(?=\D)(?![.@])|\d{6,}(?=$)

演示 -

>>>s="""010-12345678 => invalid1234567333 => valid"""
>>>re.findall(r'(?<!-|\d)(\d{6,}(?=\D)(?![.@])|\d{6,}(?=$))',s)
>>>['1234567333']

LIVEDEMO

答案 1 :(得分:1)

你可以通过使用负面的背后隐藏来确保匹配前的角色不是破折号

(?<!-|\d)

以及否定前瞻

(?!-)

因此,例如,您可以使用此代替

(?<!-|\d)(\d{6,}(?=\D)(?![.@])|\d{6,}(?=$))(?!-)

lookbehind确保原始正则表达式之前没有-或数字,确保1-000000不匹配。

前瞻确保原始正则表达式之后没有-,确保000000-1不匹配。

您必须将原始表达式包装在括号中,否则lookbehind仅对第一个选项\d{6,}(?=\D)(?![.@])执行操作,而不对第二个选项\d{6,}(?=$)执行操作。

您可以测试此正则表达式here, at regex101.com