【问题标题】:Regex (python): how to match for certain query正则表达式(python):如何匹配某些查询
【发布时间】:2021-04-13 11:39:54
【问题描述】:

我有一个字符串列表,其中每一行都是这样的:

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)

提前致谢!

【问题讨论】:

  • 不要使用字符类[...]
  • "+" 放入组"()" 中并像这样转义.r'(['+ID+']+)\.([' 等也删除最后一个.,因为您的数据不以@ 结尾987654329@
  • 另外,您应该阅读正则表达式的文档,以便真正了解所有字符的含义docs.python.org/3/library/re.html#regular-expression-syntax
  • 另外,你可以不用正则表达式id, task, environment, location = full_string.split(".")
  • @Boris。感谢您指出了这一点。当初学者需要剪一张纸而剪刀就在那儿时,他们倾向于跳到闪亮的手提钻上。

标签: python regex match


【解决方案1】:

关于模式的一些注释,其中一些已经在评论中提到。

使用当前变量,模式将是

([1])+.([db])+.([a-z])+.([a-z])+.
  • 在这里,. 匹配任何字符,而不仅仅是点。
  • 如果您不想匹配 11,则不应为组或字符类使用量词
  • 重复捕获组()+ 将捕获最后一次迭代的值,您需要将组值作为一个整体,以便您可以重复字符类
  • 由于像 1db 这样的字符串是硬编码的,因此您实际上不必捕获它们

考虑到这一点,您可以改用 2 个捕获组。当您使用re.match 时,您可以省略开头的锚点并使用\Z 断言字符串的结尾

1\.db\.([a-z]+)+\.([a-z]+)\Z
  ^    ^          ^
  Dot  group 1    group 2

Regex demo

q = re.compile(ID+r'\.'+task+'\.(['+environment+']+)+\.(['+location+']+)\Z', flags=re.I)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    相关资源
    最近更新 更多