【问题标题】:Extract only specific words inside parenthesis仅提取括号内的特定单词
【发布时间】:2021-05-07 02:27:30
【问题描述】:

我只想提取括号内的特定单词。例如,如果我有一个单词列表 ['foo', 'bar'] 和一个字符串“alpha bravo (charlie foo bar delta) foxtrot”,我想通过提取得到“alpha bravo foo bar foxtrot”。 我已经尝试过但失败了。

word_list = ['foo', 'bar']
string = 'alpha bravo (charlie foo bar delta) foxtrot'
print(re.sub(r"\([^()]*\b({})\b[^()]*\)".format('|'.join(word_list)), r'\1', string, flags = re.I))

我希望得到“alpha bravo foo bar foxtrot”,但结果是“alpha bravo bar foxtrot”。 您想告诉我如何解决这个问题吗?

【问题讨论】:

    标签: python regex extract parentheses brackets


    【解决方案1】:

    这是一种基于正则表达式的方法,使用带有回调逻辑的re.sub

    word_list = ['foo', 'bar']
    regex = r'\b(?:' + '|'.join(word_list) + r')\b'         # \b(?:foo|bar)\b
    string = 'alpha bravo (charlie foo bar delta) foxtrot'
    def repl(m):
        if m.group(1):
            return ' '.join(re.findall(regex, m.group(1)))
        else:
            return m.group(0)
    
    print(re.sub(r'\((.*?)\)|\w+', repl, string))
    

    打印出来:

    alpha bravo foo bar foxtrot
    

    为了解释,我们对以下模式进行全局正则表达式搜索:

    \((.*?)\)|\w+
    

    这将首先尝试匹配括号中的任何术语。如果找到这样的匹配,它会将整个匹配传递给回调函数repl()。此回调函数将在您的单词列表中使用re.findall 以仅保留括号中您想要的匹配项。否则,上面的正则表达式一次只能找到一个单词。

    【讨论】:

      【解决方案2】:

      这是我的自制食谱

      import re
      word_list = ['foo', 'bar']
      string = 'alpha bravo (charlie foo bar delta) foxtrot'
      string = re.split('\(|\)',string)
      text = [string[0],string[2]]
      count = 0
      for elements in string[1].split():
          if elements in word_list:
              count += 1
              text.insert(count,elements+' ')
      print(''.join(text))          
      

      【讨论】:

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