我试着用正则表达式编写模式,并尝试验证多个字符串。然而,根据正则表达式文档,似乎我的模式很好,但由于某种原因,一些无效的字符串没有被正确验证。有人能指出我在这里的错误吗?
测试用例
这是一个输入字符串的测试用例:
import re
usr_pat = r"^\$\w+_src_username_\w+$"
u_name='$ini_src_username_cdc_char4ec_pits'
m = re.match(usr_pat, u_name, re.M)
if m:
print("Valid username:", m.group())
else:
print("ERROR: Invalid user_name:\n", u_name)
我预期会出现此返回错误,因为我预期输入字符串必须以$
符号开始,然后是一个字符串_\w+
,然后是_
,然后是src
,然后是_
,然后是user_name
,然后是_
,最后仅以一个字符串\w+
结束。这就是我如何组成模式并尝试验证不同的输入字符串,但是由于某种原因,它没有被正确解析。我在这里错过了什么吗?有人能在这里指出我吗?
所需输出
以下是有效和无效输入:
有效期:
$ini_src_usrname_ajkc2e
$ini_src_password_ajkc2e
$ini_src_conn_url_ajkc2e
无效:
$ini_src_usrname_ajkc2e_chan4
$ini_src_password_ajkc2e_tst1
$ini_smi_src_conn_url_ajkc2e_tst2
ini_smi_src_conn_url_ajkc2e_tst2
$ini_src_usrname_ajkc2e_chan4_jpn3
根据regex文档,r"^\$\w+_src_username_\w+$"
这应该捕获我想要解析的逻辑,但是它不能工作我的所有测试用例。我错过了什么?谢谢
2条答案
按热度按时间enyaitl31#
\w
字符类还匹配下划线和数字:匹配Unicode单词字符;这包括可以作为任何语言中单词的一部分的大多数字符,以及数字和下划线。如果使用ASCII标志,则仅匹配[a-zA-Z 0 -9_]。
(请参阅)。
所以最后的
\w+
与cdc_char4ec_pits
的整体相匹配我认为您正在寻找
[a-zA-Z0-9]
,它将不匹配下划线。hxzsmxv22#
\w+
第一个:\w表示捕获:
1-从a到z或从A到Z的一个字母
或
2-从0到9的一个数字
或
3-下划线(_)
第二个:\w后面的加号(+)表示符合前一个词语基元一次到无限次。
所以如果我的正则表达式模式是:r”^$\w+$”
它将匹配以下字符串:'$ini_src_username_cdc_char4ec_pits'
1-^$将匹配字符串$开头的美元符号
2-\w+首先将匹配单词ini的字符i,由于+符号,它将继续匹配字符n和第二个i。之后,单词ini后面的下划线也将被匹配,这是因为\w匹配下划线而不仅仅是数字或字母,单词src也将被匹配,单词src后面的下划线也将被匹配,用户名单词也将被匹配并且整个字符串将被匹配。
您提到了“字符串”一词,如果您指的是字母和数字,例如:“bla 123”、“123455”或“BLAbla”,则可以使用类似于[a-zA-Z 0 -9]+的字符代替\w+。