如何使用正则表达式匹配名称?

use*_*315 6 python regex

我是Python的新手.我想为一些名称检查编写正则表达式.我的输入字符串可以包含az,AZ,0-9和'_',但它应该以az或AZ(不是0-9和'_')开头.我想为此写一个正则表达式.我试过了,但没有什么能完美搭配.

一旦输入字符串遵循正则表达式规则,我就可以继续进行,否则丢弃该字符串.

Joh*_*hin 6

以下是您的问题的答案:

解释你想要_(不-),这应该做的工作:

>>> 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
>>>
Run Code Online (Sandbox Code Playgroud)

坚决抵制使用的诱惑$; 这是为什么:

你好,你好,使用$是错误的,请\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
Run Code Online (Sandbox Code Playgroud)

精细手册说:

'$'
匹配字符串的结尾在字符串末尾的换行符之前 [我的强调],并且在MULTILINE模式下也匹配换行符.foo匹配'foo'和'foobar',而正则表达式foo $只匹配'foo'.更有趣的是,在'foo1 \nfoo2 \n'中搜索foo.$'正常匹配'foo2',但在MULTILINE模式下匹配'foo1'; 在'foo \n'中搜索单个$将找到两个(空)匹配:一个在换行符之前,一个在换行符的末尾.

\ 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
>>>
Run Code Online (Sandbox Code Playgroud)


YOU*_*YOU 4

>>> 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")
>>>
Run Code Online (Sandbox Code Playgroud)

注意:OP提到的string cannot start from ( 0-9 and "_").,显然_可以在文本中。这就是我使用的原因\w

注意2:如果您不希望匹配字符串以 结尾\n,您可以使用John Machin 提到的\Z代替。$

  • @Mikuso,`re.match()`仅从字符串的开头匹配。`re.search()` 需要插入符号 (2认同)