Python 中匹配非空格的正则表达式

新手上路,请多包涵

我想使用 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

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

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

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

原文由 Oliver Farren 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

[^\S] 是一个 否定字符类,等于 \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 演示

 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])

请参阅 另一个 Python 演示

原文由 Wiktor Stribiżew 发布,翻译遵循 CC BY-SA 3.0 许可协议

\s 匹配一个空白字符。

\S 匹配一个非空白字符。

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

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

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

原文由 melpomene 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题