【问题标题】:Regular expression for matching non-whitespace in PythonPython中匹配非空格的正则表达式
【发布时间】:2020-09-22 20:31:09
【问题描述】:

我想使用 re.search 来提取第一组非空白字符。我有以下伪脚本可以重现我的问题:

#!/usr/bin/env python2.7
import re

line = "STARC-1.1.1.5             ConsCase    WARNING    Warning"
m = re.search('^[^\S]*?',line)
if m:
    print m.group(0)

似乎打印的是空白而不是 STARC-1.1.1.5

据我了解,这个正则表达式是说: 在行首,找一组非空白字符,不要贪心

我很确定这会起作用,documentation 说我可以使用 /S 来匹配 [] 中的空格,所以我不确定问题出在哪里。

现在,我知道,我知道这可能看起来很奇怪,为什么我不使用其他函数来执行此操作?好吧,给猫剥皮的方法不止一种,而且我仍然掌握 Python 中正则表达式的窍门,所以我想知道如何使用 re.search 以这种方式提取该字段。

【问题讨论】:

  • 这里还有一个 re.split("\s*", line)[0]
  • @melpomene 是贪婪的。它不会在此处拆分为空字符串
  • @e4c5 我试过了,得到了FutureWarning: split() requires a non-empty pattern match.\s+ 我没有收到警告。
  • @melpomene 我也用 ipython 在 python 2.7 中尝试过,得到了想要的结果
  • 我的测试是 3.5.2。在这两种情况下我也都得到了想要的结果,但只有\s+ 没有在re.py:203 中触发警告。

标签: python regex python-2.7 whitespace


【解决方案1】:

[^\S] 是一个negated character class,它等于\s(空白模式)。 *? 是一个惰性量词,它匹配零个或多个字符,但尽可能少,并且在模式末尾使用时从不实际匹配任何字符。

m = re.search('^[^\S]*?',line) 行替换为

m = re.match(r'\S+',line)

或者 - 如果你还想允许空字符串匹配:

m = re.match(r'\S*',line)

re.match 方法将模式锚定在字符串的开头。对于re.search,您需要将^ 锚点保留在模式的开头:

m = re.search(r'^\S+',line)

Python demo

import re
line = "STARC-1.1.1.5             ConsCase    WARNING    Warning"
m = re.search('^\S+',line)
if m:
    print m.group(0)
# => STARC-1.1.1.5

但是,在这种情况下,您可以只使用split()

res = line.split() 
print(res[0])

another Python demo

【讨论】:

    【解决方案2】:

    \s 匹配一个空白字符。

    \S 匹配非空白字符。

    [...] 匹配集合... 中的一个字符。

    [^...] 匹配不在集合... 中的字符。

    [^\S] 匹配一个不是非空白字符的字符,即它匹配一个空白字符。

    【讨论】:

      【解决方案3】:
      import re
      line = "STARC-1.1.1.5             ConsCase    WARNING    Warning"
      m = re.search('S.+[0-9]',line)
      print(m.group(0))
      

      re.search返回匹配,因此请使用字母和数字并按代码中提到的匹配打印匹配。如果只打印它将其打印为匹配的变量。 希望这回答你的问题

      m = re.search('[A-Z].+[0-9]',line)
      

      将Re.Search更改为大写字母将从CAPS A到Z, 如果您将其更改为

      ,则将其更改为小字母
      m = re.search('[a-z].+[0-9]',line)
      

      它只会发现小字母,有时你应该突出显示符号,以搜索它或在该符号之前搜索字符。

      【讨论】:

      • 看起来它的作者想要提取第一个任何 i>非空格字符。此解决方案假定所有提取的字符串以字母字符开头,并以数字字符结尾。虽然作者的示例匹配此模式,但问题是关于任何非空白字符。 span>
      • 而不是发布第二个,扩展答案,更好地编辑第一个答案以包括附加信息。另请注意,来自 @toto的原始评论:(重新)阅读问题:I want to use re.search to extract the first set of non-whitespace characters. i>仍然适用。您所建议的正则表达式匹配OP的示例STARC-1.1.1.5但不匹配first set of non-whitespace characters. span>
      【解决方案4】:

      如下替换你的re.search,\S 查找非空白字符,+ 查找一次或多次。 Python 从第一个字符开始搜索。

      import re
      line = "STARC-1.1.1.5             ConsCase    WARNING    Warning"
      m = re.search('\S+',line)
      print(m.group(0))
      

      【讨论】:

      • 没有解释的代码是没有用的。你在回答什么问题?
      • (重新)阅读问题:I want to use re.search to extract the first set of non-whitespace characters.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多