我正在尝试使用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
。
答案 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.]*
总是会停止。