用于匹配 Python 中的非空格的正则表达式
Regular expression for matching non-whitespace in 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
据我了解,这个正则表达式在说:
行首,找一组非空白字符,不要贪心
我很确定这会起作用,documentation 说我可以使用 /S 来匹配 [] 中的空格,所以我不确定问题出在哪里。
现在,我知道,我知道这看起来可能很奇怪,为什么我不使用其他功能来做到这一点?好吧,给猫剥皮的方法不止一种,我还在掌握 Python 中的正则表达式,所以我想知道如何使用 re.search 来提取这个字段时尚
[^\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])
\s
匹配空白字符。
\S
匹配非空白字符。
[...]
匹配集合 ...
.
中的一个字符
[^...]
匹配不在集合 ...
.
中的字符
[^\S]
匹配一个不是非空白字符的字符,即它匹配一个空白字符。
如下替换你的re.search,\S查找非空白字符,+查找一次或多次。 Python 从第一个字符开始搜索。
import re
line = "STARC-1.1.1.5 ConsCase WARNING Warning"
m = re.search('\S+',line)
print(m.group(0))
import re
line = "STARC-1.1.1.5 ConsCase WARNING Warning"
m = re.search('S.+[0-9]',line)
print(m.group(0))
re.search returns 匹配,所以使用字母和数字并打印代码中提到的匹配。如果您只打印变量,它将打印为匹配 1。
希望这能回答您的问题
m = re.search('[A-Z].+[0-9]',line)
把re.search改成大写字母会发现从大写字母A到Z,
反之亦然,如果你把它改成小写字母 as
m = re.search('[a-z].+[0-9]',line)
它只会找到小字母,有时你也应该突出显示符号,从中搜索或搜索到该符号之前的字符。
我想用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 来提取这个字段时尚
[^\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])
\s
匹配空白字符。
\S
匹配非空白字符。
[...]
匹配集合 ...
.
[^...]
匹配不在集合 ...
.
[^\S]
匹配一个不是非空白字符的字符,即它匹配一个空白字符。
如下替换你的re.search,\S查找非空白字符,+查找一次或多次。 Python 从第一个字符开始搜索。
import re
line = "STARC-1.1.1.5 ConsCase WARNING Warning"
m = re.search('\S+',line)
print(m.group(0))
import re
line = "STARC-1.1.1.5 ConsCase WARNING Warning"
m = re.search('S.+[0-9]',line)
print(m.group(0))
re.search returns 匹配,所以使用字母和数字并打印代码中提到的匹配。如果您只打印变量,它将打印为匹配 1。 希望这能回答您的问题
m = re.search('[A-Z].+[0-9]',line)
把re.search改成大写字母会发现从大写字母A到Z, 反之亦然,如果你把它改成小写字母 as
m = re.search('[a-z].+[0-9]',line)
它只会找到小字母,有时你也应该突出显示符号,从中搜索或搜索到该符号之前的字符。