我有一个字符串列表,其中每一行都是这样的:
1.alfa.america.game
我需要用不同的参数查询这一行,如果匹配,则打印它。在这个例子中,我得到了所有具有";1〃;以及";db";,但也得到其他,即:
11.alfa.cad.base
我不想用"11〃;也不是";d.b";,只有完全匹配。这就是我所做的:
代码:
ID = "1"
task = "db"
environment = "a-z"
location = "a-z"
fullString = "1.alfa.america.game" #this string can change
q = re.compile(r'(['+ID+'])+.(['+task+'])+.(['+environment+'])+.(['+location+'])+.', flags=re.I | re.X)
m = q.match(fullString)
if m:
print (fullString)
提前感谢!
关于模式的一些注意事项,其中一些已经在注释中提到。
对于当前变量,模式将是
([1])+.([db])+.([a-z])+.([a-z])+.
- 这里,
.
匹配任何字符,而不是仅匹配一个点 - 如果不想匹配11,则不应为组或字符类使用量词
- 重复捕获组
()+
将捕获上一次迭代的值,您希望将组值作为一个整体,以便可以重复字符类 - 由于像
1
和db
这样的字符串是硬编码的,所以实际上不必捕获它们
考虑到这一点,您可以使用2个捕获组。在使用re.match时,可以省略开头的锚点,并使用Z
断言字符串的末尾
1.db.([a-z]+)+.([a-z]+)Z
^ ^ ^
Dot group 1 group 2
Regex演示
q = re.compile(ID+r'.'+task+'.(['+environment+']+)+.(['+location+']+)Z', flags=re.I)