【问题标题】:Python regex: excluding square brackets and the text insidePython regex:不包括方括号和里面的文本
【发布时间】:2019-09-23 00:16:12
【问题描述】:

我正在尝试编写一个排除方括号和其中的文本的正则表达式。

我的示例文本如下所示:'WordA, WordB, WordC, [WordD]'

我想匹配字符串中除'[WordD]' 之外的每个文本项。我尝试过使用负前瞻,例如...[A-Z][A-Za-z]+(?!\[[A-Z]+\]),但这样做仍然匹配括号内的文本。

负前瞻是最好的方法吗?如果是这样,我哪里出错了?

【问题讨论】:

    标签: python regex regex-lookarounds


    【解决方案1】:

    您可以考虑用逗号分割,然后根据单词是否以[开头进行过滤,而不是正则表达式:

    output = [word for word in str.split(', ') if word[0] != '[']
    

    如果您使用正则表达式,您可以匹配字符串的开头,也可以在后面查找空格:

    re.findall(r'(?:^|(?<= ))[A-Z][A-Za-z]+', str)
    

    或者您可以在结尾处,在单词边界之后否定前瞻 ]

    output = re.findall(r'[A-Z][A-Za-z]+\b(?!\])', str)
    

    【讨论】:

      【解决方案2】:

      这可以很简单

      (\w+),
      

      Regex Demo

      检索第 1 组的值以获得所需结果。

      【讨论】:

        【解决方案3】:

        我猜你可能想写一些类似的表达式:

        [A-Z][a-z]*[A-Z](?=,|$)
        

        或者,

        [A-Z][a-z]+[A-Z](?=,|$)
        

        测试

        import re
        
        
        regex = r"[A-Z][a-z]*[A-Z](?=,|$)"
        string = """
        WordA, WordB, WordC, [WordD]
        WordA, WordB, WordC, [WordD], WordE
        """
        
        print(re.findall(regex, string))
        

        输出

        ['WordA', 'WordB', 'WordC', 'WordA', 'WordB', 'WordC', 'WordE']
        

        如果您希望简化/修改/探索表达式,在regex101.com 的右上角面板中已对此进行了说明。如果您愿意,您还可以在this link 中观看它如何与一些示例输入匹配。


        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-08
          • 1970-01-01
          • 2011-01-20
          • 1970-01-01
          • 2022-12-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多