regex 如何用正则表达式限制字符串模式列表?

yqkkidmi  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(127)

我试着用正则表达式编写模式,并尝试验证多个字符串。然而,根据正则表达式文档,似乎我的模式很好,但由于某种原因,一些无效的字符串没有被正确验证。有人能指出我在这里的错误吗?

测试用例

这是一个输入字符串的测试用例:

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+$"这应该捕获我想要解析的逻辑,但是它不能工作我的所有测试用例。我错过了什么?谢谢

enyaitl3

enyaitl31#

\w字符类还匹配下划线和数字:
匹配Unicode单词字符;这包括可以作为任何语言中单词的一部分的大多数字符,以及数字和下划线。如果使用ASCII标志,则仅匹配[a-zA-Z 0 -9_]。
(请参阅)。
所以最后的\w+cdc_char4ec_pits的整体相匹配
我认为您正在寻找[a-zA-Z0-9],它将不匹配下划线。

usr_pat = r"^\$[a-zA-Z0-9]+_src_username_[a-zA-Z0-9]+$"
hxzsmxv2

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+。

相关问题