【问题标题】:Regular expression to return all characters between two special characters正则表达式返回两个特殊字符之间的所有字符
【发布时间】:2012-04-10 23:45:46
【问题描述】:

我将如何使用 regx 返回两个括号之间的所有字符。 这是一个例子:

foobar['infoNeededHere']ddd
needs to return infoNeededHere

我在大括号之间找到了一个正则表达式,但所有试图让它与方括号一起工作的尝试都失败了。这是正则表达式:(?<={)[^}]*(?=}),这是我尝试破解它的尝试

(?<=[)[^}]*(?=])

最终解决方案:

import re

str = "foobar['InfoNeeded'],"
match = re.match(r"^.*\['(.*)'\].*$",str)
print match.group(1)

【问题讨论】:

    标签: python regex parsing


    【解决方案1】:

    如果您是 REG(gular)EX(pressions) 的新手,您可以通过 Python Docs 了解它们。或者,如果您想要更温和的介绍,可以查看HOWTO。它们使用 Perl 风格的语法。

    正则表达式

    您需要的表达式是.*?\[(.*)\].*。您想要的组将是\1
    - .*?: . 匹配除换行符以外的任何字符。 * 是一个元字符,表示重复此 0 次或多次? 使 * 非贪婪,即 . 在点击 '[' 之前将匹配尽可能少的字符。
    - \[: \ 转义特殊元字符,在本例中为 [。如果我们不这样做,[ 会做一些非常奇怪的事情。
    - (.*): 括号“组”里面的任何内容,您以后可以按组的数字 ID 或名称检索组(如果有的话)。
    - \].*你现在应该已经足够了解这意味着什么了。

    实施

    首先,将re 模块——它不是内置模块——导入到你想使用表达式的任何地方。

    然后,使用re.search(regex_pattern, string_to_be_tested) 在要测试的字符串中搜索模式。这将返回一个MatchObject,您可以将其存储到一个临时变量中。然后,您应该调用它的 group() 方法并将 1 作为参数传递(以查看我们之前使用括号捕获的“组 1”)。我现在应该是这样的:

    >>> import re
    >>> pat = r'.*?\[(.*)].*'             #See Note at the bottom of the answer
    >>> s = "foobar['infoNeededHere']ddd"
    >>> match = re.search(pat, s)
    >>> match.group(1)
    "'infoNeededHere'"
    

    另一种选择

    您还可以使用findall() 将正则表达式修改为(?&gt;=\[).+?(?=\]) 来查找所有不重叠的匹配项。
    - (?&lt;=\[): (?&lt;=) 被称为后视断言并检查实际匹配之前的表达式。
    - .+?: +* 一样,只是它匹配 一个 或多个重复。 ? 使其不贪婪。
    - (?=\]): (?=) 是一个预测 断言并检查表达式跟随匹配而不捕获它。 您的代码现在应该如下所示:

    >>> import re
    >>> pat = r'(?<=\[).+?(?=\])'  #See Note at the bottom of the answer
    >>> s = "foobar['infoNeededHere']ddd[andHere] [andOverHereToo[]"
    >>> re.findall(pat, s)
    ["'infoNeededHere'", 'andHere', 'andOverHereToo['] 
    

    注意:始终通过在字符串前添加“r”来使用原始 Python 字符串(例如:r'blah blah blah')。

    10 倍的阅读量!我在没有接受的时候写了这个答案,但是当我完成它时,出现了 2 个矿石,一个被接受了。 :( x

    【讨论】:

    • 这对我有用,完美,也谢谢你的解释。
    【解决方案2】:

    ^.*\['(.*)'\].*$ 将匹配一行并在组中捕获您想要的内容。

    您必须使用\ 转义[]

    rubular.com proof 链接上的文档将解释表达式是如何形成的。

    【讨论】:

    • 我可以在 re.search 中使用它吗?
    • a = re.search("^.*\['(.*)'\].*$","foobar['infoNeededHere']ddd") print a.group() 正在返回 foobar['infoNeededHere']ddd
    • 关于学习正则表达式 - 我最喜欢的教程是 TextWrangler manual 的第 8 章。它非常易于阅读,并以逻辑顺序介绍了正则表达式概念和语法,并附有大量示例。我一直在我的办公桌上放着那一章的副本。
    【解决方案3】:

    如果每行只有一个 [.....] 标记,那么您根本不需要使用正则表达式:

    In [7]: mystring = "Bacon, [eggs], and spam"
    
    In [8]: mystring[ mystring.find("[")+1 : mystring.find("]") ]
    Out[8]: 'eggs'
    

    如果每行不止一个,那么您需要修改 Jarrod 的正则表达式 ^.*\['(.*)'\].*$ 以匹配每行多次,并且不要贪心。 (使用.*? 量词而不是.* 量词。)

    In [15]: mystring = "[Bacon], [eggs], and [spam]."
    
    In [16]: re.findall(r"\[(.*?)\]",mystring)
    Out[16]: ['Bacon', 'eggs', 'spam']
    

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 2022-11-29
      • 2011-08-31
      • 1970-01-01
      • 2017-07-16
      • 2023-03-16
      相关资源
      最近更新 更多