【问题标题】:Python regex confused by brackets ([])? [duplicate]Python 正则表达式被括号([])混淆了? [复制]
【发布时间】:2011-03-10 18:56:57
【问题描述】:

是python糊涂了,还是程序员糊涂了?

我有很多这样的行:

some_dict[0x2a] = blah
some_dict[0xab] = blah, blah

我想做的是将十六进制代码转换为全大写,如下所示:

some_dict[0x2A] = blah
some_dict[0xAB] = blah, blah

所以我决定调用正则表达式。通常,我只是使用我的编辑器的正则表达式(xemacs)来执行此操作,但是转换为大写的需要将一个推入 Lisp。 ....好的... Python 怎么样?

所以我整理了一个不起作用的简短脚本。我已经将代码压缩到这个例子中,它也不起作用。在我看来,Python 的正则表达式被代码中的括号弄糊涂了。是我还是 Python?

import fileinput
import sys
import re


this = "0x2a"
that = "[0x2b]"

for line in [this, that]:
    found = re.match("0x([0-9,a-f]{2})", line)

    if found:
        print("Found: %s" % found.group(0))

(我使用的是 () 分组结构,因此我不会将 '0x' 中的 'x' 大写。)

此示例仅打印 0x2a 值,而不是 0x2b。这是正确的行为吗?

我可以通过将匹配表达式更改为:

    found = re.match("\[0x([0-9,a-f]{2}\])", line)

但我只是想知道是否有人可以让我了解这里发生了什么。

在 Linux 上运行 Python 2.6.2。

【问题讨论】:

  • 您知道[] 在正则表达式中有特殊含义吗?他们不是只是个字符吗?您正在阅读什么正则表达式文档?我看不到您的'\\[...\\] 版本有任何方法。你有什么问题?
  • 你不需要字符类中的 , [0-9a-b] 可以正常工作。
  • @FallingBullets:很高兴知道。谢谢!

标签: python regex


【解决方案1】:

re.match 从字符串的 start 开始匹配。使用re.search 代替“匹配字符串中任何位置的第一次出现”。文档中关于此的关键部分是 here

【讨论】:

  • 啊,这么简单。脏话!谢谢,亚历克斯。
【解决方案2】:

我认为您不需要括号内的逗号。即:

found = re.match("0x([0-9,a-f]{2})", line)

告诉 python 寻找它可能错误匹配的逗号。我想你想要

found = re.match("0x([0-9a-f]{2})", line)

【讨论】:

  • 这应该是一条评论,因为它没有回答问题。
  • 我还没有足够的声望离开 cmets,抱歉。
  • 啊,好的,没问题。对不起自己:D
【解决方案3】:

您正在使用部分模式,因此您不能使用 re.match,它期望匹配整个输入字符串。需要使用re.search,可以进行部分匹配。

>>> that = "[0x2b]"
>>> m = re.search("0x([0-9,a-f]{2})", that)
>>> m.group()
'0x2b'

【讨论】:

  • re.match 不希望匹配整个输入字符串。它尝试在字符串的开头进行匹配。如果要匹配整个字符串,则需要将r"\Z" (NOT "$") 附加到模式中。
【解决方案4】:

你会想要改变

found = re.match("0x([0-9,a-f]{2})", line)

found = re.search("0x([0-9,a-f]{2})", line)

re.match 将匹配仅从字符串的开头,在“[0x2b]”情况下失败。

re.search 将匹配字符串中的任何位置,因此忽略“[0x2b]”情况下的前导“[”。

详情请见search() vs. match()

【讨论】:

  • re.match 不希望匹配整个输入字符串。它尝试在字符串的开头进行匹配。如果要匹配整个字符串,则需要将 r"\Z" (NOT "$") 附加到模式中。
  • 正确,已相应更新。谢谢。
【解决方案5】:

您想使用re.searchThis explains why.

【讨论】:

    【解决方案6】:

    如果你使用 re.sub,并传递一个 callable 作为替换字符串,它也会为你做大写:

    >>> that = 'some_dict[0x2a] = blah'
    >>> m = re.sub("0x([0-9,a-f]{2})", lambda x: "0x"+x.group(1).upper(), that)
    >>> m
    'some_dict[0x2A] = blah'
    

    【讨论】:

      猜你喜欢
      • 2018-06-01
      • 2023-03-08
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      相关资源
      最近更新 更多