Я - новичок в Python. Я хочу записать регулярное выражение для некоторой проверки имени. Моя входная строка может содержать a-z, A-Z, 0-9, и '_', но это должно запуститься или с a-z или с A-Z (не 0-9 и '_'). Я хочу записать регулярное выражение для этого. Я попробовал, но ничто не соответствовало отлично.
После того как входная строка следует правилам регулярного выражения, я могу продолжить двигаться далее, иначе удалить ту строку.
Вот ответ на ваш вопрос:
Интерпретируя, что вы хотите _
(не -
), это должно сработать:
>>> tests = ["a", "A", "a1", "a_1", "1a", "_a", "a\n", "", "z_"]
>>> for test in tests:
... print repr(test), bool(re.match(r"[A-Za-z]\w*\Z", test))
...
'a' True
'A' True
'a1' True
'a_1' True
'1a' False
'_a' False
'a\n' False
'' False
'z_' True
>>>
Упорно сопротивляйтесь искушению использовать $
; вот почему:
Привет, привет, использование $
- это НЕПРАВИЛЬНО, используйте \Z
вместо этого
>>> re.match(r"[a-zA-Z][\w-]*$","A")
<_sre.SRE_Match object at 0x00BAFE90>
>>> re.match(r"[a-zA-Z][\w-]*$","A\n")
<_sre.SRE_Match object at 0x00BAFF70> # WRONG; SHOULDN'T MATCH
>>>
>>> re.match(r"[a-zA-Z][\w-]*\Z","A")
<_sre.SRE_Match object at 0x00BAFE90>
>>> re.match(r"[a-zA-Z][\w-]*\Z","A\n")
>>> # CORRECT: NO MATCH
В Fine Manual сказано:
'$'
или непосредственно перед новой строкой в конце строки (выделено мной), а в режиме MULTILINE также перед новой строкой. foo соответствует как 'foo', так и 'foobar', в то время как регулярное выражение foo$ соответствует только 'foo'. Более интересно, что поиск foo.$ в 'foo1\nfoo2\n' соответствует 'foo2' обычно, но 'foo1' в режиме MULTILINE; поиск одного $ в 'foo\n' найдет два (пустых) соответствия: одно непосредственно перед новой строкой, и одно в конце строки.
and
\Z
Совпадает только с концом строки.
=== А теперь кое-что совершенно другое ===
>>> import string
>>> letters = set(string.ascii_letters)
>>> ok_chars = letters | set(string.digits + "_")
>>>
>>> def is_valid_name(strg):
... return strg and strg[0] in letters and all(c in ok_chars for c in strg)
...
>>> for test in tests:
... print repr(test), repr(is_valid_name(test))
...
'a' True
'A' True
'a1' True
'a_1' True
'1a' False
'_a' False
'a\n' False
'' ''
'z_' True
>>>
>>> import re
>>> re.match("[a-zA-Z][\w-]*$","A")
<_sre.SRE_Match object at 0x00932E20>
>>> re.match("[a-zA-Z][\w-]*$","A_B")
<_sre.SRE_Match object at 0x008CA950>
>>> re.match("[a-zA-Z][\w-]*$","0A")
>>>
>>> re.match("[a-zA-Z][\w-]*$","!A_B")
>>>
Примечание : указанная OP строка не может начинаться с (0-9 и "_").
, видимо _ может быть в тексте. Вот почему я использую \ w
Note2 : если вы не хотите, чтобы строка соответствия оканчивалась на \ n
, вы можете использовать \ Z
вместо $
, как упомянул Джон Мачин.
вот путь без ответа
import string
flag=0
mystring="abcadsf123"
if not mystring[0] in string.digits+"_":
for c in mystring:
if not c in string.letters+string.digits+"-":
flag=1
if flag: print "%s not ok" % mystring
else: print "%s ok" % mystring
else: print "%s starts with digits or _" % mystring