Python 如果正则表达式与条件匹配,为什么代码不工作需要从字符串返回True或False
我编写了一个程序来查找匹配项。工作正常。如果字符串不正确,则必须返回false。例如,如果我的字符串包含2个逗号,则必须返回false,而不是reject或any,如果出现其他字符串,则必须返回false。我的字符串仅期望字符串为拒绝或任何 下面的字符串应为falsePython 如果正则表达式与条件匹配,为什么代码不工作需要从字符串返回True或False,python,regex,Python,Regex,我编写了一个程序来查找匹配项。工作正常。如果字符串不正确,则必须返回false。例如,如果我的字符串包含2个逗号,则必须返回false,而不是reject或any,如果出现其他字符串,则必须返回false。我的字符串仅期望字符串为拒绝或任何 下面的字符串应为false test = '''192.168.1.1,192.168.1.2/32,192.168.1.5-192.168.1.7,reject,any,ip_address reject,192.168.1.1/32,rejec
test = '''192.168.1.1,192.168.1.2/32,192.168.1.5-192.168.1.7,reject,any,ip_address
reject,192.168.1.1/32,reject,any,
172.168.1.4-172.168.1.4,reject'''
bool(re.search('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/?\d{0,}|[any|reject]+', test))
期望的结果是假的,我的结果是真的
期望的结果是假的,我的结果是真的
预料之外
假的
它不是文档中的副本
re.searchpattern,字符串,标志=0
扫描字符串,查找正则表达式模式生成匹配的第一个位置,并返回相应的匹配对象。如果字符串中没有与模式匹配的位置,则返回None;请注意,这与在字符串中的某个点查找零长度匹配不同
您的正则表达式与第一个IP匹配,然后返回True
如果希望整个字符串仅包含IP或any或reject,则必须锚定正则表达式,此正则表达式起作用:
^(?:(?:-?\d{1,3}(?:\.\d{1,3}){3}(?:/\d+)?|\b(?:any|reject)\b),?)+$
说明:
为什么要它返回false?如果匹配,搜索返回true,在这里,它至少匹配第一个IP地址。使用^?:?:\d{1,3}:\.\d{1,3}{3}:/\d+?::任何|拒绝,+$您能为我们显示有效字符串的结果吗?您的正则表达式不包括-您还可以使用anyany返回True。而且您没有考虑字符串的多行部分。@naurel:捕捉得好,修复得差不多了!任何结果都将返回True。如果我是正确的,则-在没有掩码的情况下只能在2个IP之间。请注意,CDA未指定此选项。您可以稍微缩短您的模式,将|\b?:any | reject\b、+$替换为| any | reject\b、+$
test1 = '''192.168.1.1,192.168.1.2/32,192.168.1.5-192.168.1.7,reject,any,,,,
reject,192.168.1.1/32,reject,any,
172.168.1.4-172.168.1.4,reject'''
bool(re.search('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/?\d{0,}|[any|reject]+', test1))
^(?:(?:-?\d{1,3}(?:\.\d{1,3}){3}(?:/\d+)?|\b(?:any|reject)\b),?)+$
^ # beginning of line
(?: # start non capture group
(?: # start non capture group
(?: # start non capture group
(?<=\d) # positive lookbehind, make sure we have a digit before
- # an hyphen
)? # end group, optional
\d{1,3} # 1 up to 3 digits
(?: # start non capture group
\. # a dot
\d{1,3} # 1 up to 3 digits
){3} # end group, must appear 3 times
(?: # start non capture group
/ # a slash
\d+ # 1 or more digits
)? # end group, optional
| # OR
\b # word boundary
(?: # start non capture group
any # literally "any"
| # OR
reject # literally "reject"
) # end goup
\b # word boundary
) # end group
,? # optional comma
)+ # end group, may appear 1 or more times
$ # end of line
import re
test1 = '''192.168.1.1,192.168.1.2/32,192.168.1.5-192.168.1.7,reject,any,,,,
reject,192.168.1.1/32,reject,any,
172.168.1.4-172.168.1.4,reject'''
res = bool(re.search(r'^(?:(?:(?:(?<=\d)-)?\d{1,3}(?:\.\d{1,3}){3}(?:/\d+)?|\b(?:any|reject)\b),?)+$', test1))
print(res)
False