正则表达式用于不以数字开头的模式python

时间:2018-10-10 16:53:29

标签: python regex python-3.x

我正在尝试使用python掌握Regexp。我正在尝试匹配以下模式,其中字符块的第一个字符不能为数字,而其余字符可以为任何数字或字符或_。第一个字符只能是_或字符。例如

7lucky is invalid
_lucky is valid
_7lucky is valid
lucky.john is valid

我的代码:

exp=re.compile(r"(\b[_a-z][-a-z0-9.]*\b)")
name="-john"
result= exp.search(name)

这也接受-john,而应该只接受_a-z

2 个答案:

答案 0 :(得分:2)

这不会为-john找到任何东西,但找到_john

import re
exp=re.compile(r"^(\b[_a-z][-a-z0-9.]*\b)")
names=["john","-john","7john","_john"]
for n in names:
    if exp.search(n): 
        print(n)
    else:
        print("not found in :"+n)

输出:

john
not found in :-john
not found in :7john
_john

区别在于我在^前面加上了模式,意思是:行首。


从doku​​:https://docs.python.org/3/library/re.html#re.search

  

re.search(pattern, string, flags=0)扫描字符串以查找   正则表达式模式产生第一个位置的位置   匹配,并返回相应的匹配对象。如果否则不返回   字符串中的位置与模式匹配;请注意,这是   与在   字符串。

re.search不必在字符串的开头查找-将re.match(pattern, string, flags=0)用于隐式的“在字符串开头查找”搜索:

exp=re.compile(r"(\b[_a-z][-a-z0-9.]*\b)")  # works as well, using match
names=["john","-john","7john","_john"]
for n in names:
    if exp.match(n): 
        print(n)
    else:
        print("not found in :"+n)

答案 1 :(得分:1)

问题出在您的边界上:它与-和一个字母之间的边界匹配。
您必须以另一种方式进行重新加工。

我选择仅在不以非空格字符开头的情况下使用后向匹配项,将\b替换为(?<!\S)
(?<!\S)[_a-z][-a-z0-9.]*

注意:尾随的单词边界是没有用的,因为当不再满足时,尝试匹配[-a-z0-9.]*总是会停止。