【问题标题】:Extract specific pattern from text python 3 [duplicate]从文本python 3中提取特定模式[重复]
【发布时间】:2018-11-20 20:03:44
【问题描述】:

我有一个类似于avg(foo) 的字符串,我只想从中提取foo。为此,我正在使用

import re
re.sub(")( avg","","avg(foo)")

但这不起作用。我哪里错了?

【问题讨论】:

  • 请更清楚你想要什么。你想要'foo' 的出现,或者'avg(…)' 的括号内的任何字符串的出现,或者函数的任何括号内,或者根本任何括号内,或其他什么?

标签: python regex python-3.x


【解决方案1】:

我们可以在这里使用re.search,带有一个捕获组来提取函数调用中的文本到avg()

f_search = re.search(r'\((.*?)\)', 'avg(foo)', re.IGNORECASE)

if f_search:
    print f_search.group(1)

Demo

【讨论】:

    【解决方案2】:

    首先,括号表示正则表达式语法中的捕获组,因此如果要匹配文字括号,则需要对其进行转义。其次,如果你想找到一个特定的字符串,你应该使用re.searchre.match(),在这种情况下,由于子字符串没有出现在字符串的开头,你应该使用re.search()。第三,匹配括号之间所有内容的正确正则表达式取决于您是否要匹配嵌套的。可以使用r"\(([^)(]*)\) 来匹配除括号字符之外的所有内容。另一种选择是 \((.*)\) 以匹配括号之间的所有内容,但仍取决于您的预期格式。

    演示:

    >>> m = re.search(r"\(([^)(]*)\)","avg(foo)")
    >>> m.group(1)
    'foo'
    >>> m = re.search(r"\((.*)\)","avg(f(o)o)")
    >>> m.group(1)
    'f(o)o'
    >>> m = re.search(r"\(([^)(]*)\)","avg(f(o)o)")
    >>> m.group(1)
    'o'
    

    【讨论】:

      【解决方案3】:

      首先我要离开了,你可能想为你的模式使用 r-strings,此外你需要稍微改变你的模式r"avg\((.*)\)" 就足够了。

      import re
      
      re.findall(r"avg\((.*)\)", "avg(foo)")
      # Will return ['foo']
      

      那么这里发生了什么?
      我们使用re.findall 来查找与该模式匹配的所有匹配项。

      模式可以分解为:

      1. avg\(avg( 开头的东西
      2. (.*) 任何字符串的子组(可以修改以匹配更严格的模式)
      3. 最后是\),它将匹配单个“)”。

      【讨论】:

        猜你喜欢
        • 2016-10-20
        • 1970-01-01
        • 2018-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-04
        相关资源
        最近更新 更多