1

このコードは、先頭と末尾に空白を含む文字列を許可しないことになっています。何らかの理由で、このコードで否定的な結果が得られました

import re
def is_match(pattern, string):
    return True if len(re.compile(pattern).findall(string)) == 1 else False
print(is_match("[^\s]+[a-zA-Z0-9]+[^\s]+", '1'))

ただし、他の文字列は問題なく動作します。結果が負である理由を説明したり、より良い機能を提供したりできますか(Pythonの初心者)。

4

6 に答える 6

4

あなたが探している正規表現は^\s|\s$

xs = ["no spaces", "  starts", "ends  ", "\t\tboth\n\n", "okay"]

import re
print [x for x in xs if re.search(r'^\s|\s$', x)]

## ['  starts', 'ends  ', '\t\tboth\n\n']

^\s.*?\s$両端の空白のみに一致します:

print [x for x in xs if re.search(r'^\s.*?\s$', x, re.S)]

## ['\t\tboth\n\n']

逆式(開始-終了空白なし)は^\S.*?\S$次のとおりです。

print [x for x in xs if re.search(r'^\S.*?\S$', x, re.S)]

## ['no spaces', 'okay']
于 2012-04-27T15:40:01.950 に答える
4

文字列の先頭または末尾の空白をチェックする最も簡単な方法は、正規表現を使用しません。

if test_string != test_string.strip():
于 2012-04-27T14:52:17.137 に答える
1
def is_whiteSpace(string):
    t=' ','\t','\n','\r'
    return string.startswith(t) or string.endswith(t)


print is_whiteSpace(" GO") -> True
print is_whiteSpace("GO") -> False
print is_whiteSpace("GO ") -> True
print is_whiteSpace(" GO ") -> True
于 2012-04-27T13:53:26.370 に答える
1

派手な正規表現は必要ありません。より読みやすい方法を使用するだけです。

>>> def is_whitespace(s):
    from string import whitespace
    return any((s[0] in whitespace, s[-1] in whitespace))

>>> map(is_whitespace, ("foo", "bar ", " baz", "\tspam\n"))
[False, True, True, True]
于 2012-04-27T14:49:36.247 に答える
0

スペースを含まない文字列を検出する正規表現を構築しようとする代わりに、スペースを含む文字列をチェックし、コード内のロジックを反転する方が簡単です。

一致が見つからない場合は (論理的な false 値)をre.match()返し、一致した場合はオブジェクト (論理的な true 値) を返すことに注意してください。それを使用して、次のように記述します。NoneSRE_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.
于 2012-04-27T13:47:38.330 に答える
0

ch3ka の提案の変形:

import string
whitespace = tuple(string.whitespace)

'a '.endswith(whitespace)
## True

'a '.startswith(whitespace)
## False

'a\n'.endswith(whitespace)
## True

'a\t'.endswith(whitespace)
## True

whitespace正規表現よりも覚えやすいと思います(タプルに変換するビットを除く)。

于 2020-06-20T06:42:51.127 に答える