【问题标题】:How can I write python regular expression to match multiple space in a row如何编写python正则表达式以匹配连续的多个空格
【发布时间】:2012-11-28 18:52:37
【问题描述】:

我有一个这样的字符串,它在'READY'之前和'READY'之后有多个空格

以下示例中的所有空格都是空格

'1df34343 43434sebb              READY                     '

如何编写一个正则表达式,可以得到 '1df34343 43434sebb' 作为 result.group(1)?

【问题讨论】:

  • 3 and 4..343 434.. 之间是否只有一个空格?

标签: python regex


【解决方案1】:

如果后面有多个空格 + READY,则会捕获所需的组。使用正向预测。

(\S+ \S+)(?=\s{2,}READY)

【讨论】:

    【解决方案2】:

    这是一个非常简单的正则表达式,它捕获所有内容,直到它看到连续两个空格:

    In [11]: s = '1df34343 43434sebb              READY                     '
    
    In [12]: re.match(r'(.*?)\s\s', s).groups()
    Out[12]: ('1df34343 43434sebb',)
    

    这符合我理解的您的要求。如有不妥,请澄清。

    【讨论】:

      【解决方案3】:

      如果您了解正则表达式,您应该知道以下内容:

      • \s : 空白字符
      • \S : 非空白字符
      • + :至少有一个之前的捕获。

      脚本:

      >>> import re
      >>> s = '1df34343 43434sebb              READY                     '
      >>> ms = re.match(r"(\S+ \S+)\s+(\S+)\s+", s)
      >>> ms.groups()
      ('1df34343 43434sebb', 'READY')
      >>> ms.group(1)
      '1df34343 43434sebb'
      >>> ms.group(2)
      'READY'
      

      如果您需要更详细地解析您所拥有的内容,您甚至可以使用功能更强大的正则表达式:

      >>> ms = re.match(r"((\S+) (\S+))\s+(\S+)\s+", s)
      >>> ms.groups()
      ('1df34343 43434sebb', '1df34343', '43434sebb', 'READY')
      >>> ms.group(1)
      '1df34343 43434sebb'
      >>> ms.group(2)
      '1df34343'
      >>> ms.group(3)
      '43434sebb'
      >>> ms.group(4)
      'READY'
      

      【讨论】:

        【解决方案4】:

        匹配任何之前多空间组:

         re.compile(r'^(.*?)(?:\s{2,})')
        

        输出:

        >>> import re
        >>> multispace = re.compile(r'^(.*?)(?:\s{2,})')
        >>> multispace.match('1df34343 43434sebb              READY                     ').groups()
        ('1df34343 43434sebb',)
        

        【讨论】:

          【解决方案5】:

          为什么不把你的字符串分成 2 个或更多的空格。您将获得一个列表,您可以从中获得第一个元素,这是您需要的元素。你真的不需要复杂的正则表达式:-

          >>> s = '1df34343 43434sebb              READY                     '
          >>> import re
          >>> re.split(r'[ ]{2,}', s)[0]
          >>> '1df34343 43434sebb'
          

          【讨论】:

          • 这样做有什么好处?我不认为这比匹配更有效,从长远来看你会失去一些功能。
          • @InbarRose.. 好吧,我认为 split 最适合 OP 发布的字符串。并不是说它是好是坏。即使拆分使用regex。而且,我自己也很喜欢Regex。但是对于这种特殊情况,当 OP 只想要第一部分时,使用构建正则表达式来匹配完整的字符串似乎有点过头了。
          猜你喜欢
          • 1970-01-01
          • 2015-04-29
          • 1970-01-01
          • 2021-09-21
          • 1970-01-01
          • 1970-01-01
          • 2015-07-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多