スペースを含まない文字列を検出する正規表現を構築しようとする代わりに、スペースを含む文字列をチェックし、コード内のロジックを反転する方が簡単です。
一致が見つからない場合は (論理的な false 値)をre.match()
返し、一致した場合はオブジェクト (論理的な true 値) を返すことに注意してください。それを使用して、次のように記述します。None
SRE_Match
In [24]: spaces_pattern = re.compile ( r"^(\s.+|.+\s)$" )
In [27]: for s in ["Alpha", " Bravo", "Charlie ", " Delta "]:
....: if spaces_pattern.match(s):
....: print ( "%s had whitespace." % s )
....: else:
....: print ( "%s did not have whitespace." % s )
....:
Alpha did not have whitespace.
Bravo had whitespace.
Charlie had whitespace.
Delta had whitespace.
^$
アンカーを使用して、入力文字列全体を強制的に一致させることに注意してください。
編集:
これには正規表現もまったく必要ありません-最初と最後の文字を確認するだけで済みます:
test_strings = ['a', ' b', 'c ', ' d ', 'e f', ' g h', ' i j', ' k l ']
for s in test_strings:
if s[0] in " \n\r\t":
print("'%s' started with whitespace." % s)
elif s[-1] in " \n\r\t":
print("'%s' ended with whitespace." % s)
else:
print("'%s' was whitespace-free." % s)
編集2:
どこでも機能する正規表現: ^\S(.*\S)?
. \S
正規表現の方言に含まれていない場合は、("anything but whitespace")に相当するローカルを考え出す必要があるかもしれません。
test_strings = ['a', ' b', 'c ', ' d ', 'e f', ' g h', ' i j', ' k l ']
import re
pat = re.compile("^\S(.*\S)?$")
for s in test_strings:
if pat.match(s):
print("'%s' had no whitespace." % s)
else:
print("'%s' had whitespace." % s)
\S
は の否定形であることに注意してください。\s
つまり、 「空白以外」を\S
意味します。
また、マッチの一部をオプションにすることで、長さ 1 の文字列が考慮されることにも注意してください。( を使用することを考えるかもしれません\S.*\S
が、これは少なくとも 2 の長さの一致を強制します。)
'a' had no whitespace.
' b' had whitespace.
'c ' had whitespace.
' d ' had whitespace.
'e f' had no whitespace.
' g h' had whitespace.
' i j' had whitespace.
' k l ' had whitespace.