Python 如果正则表达式与条件匹配,为什么代码不工作需要从字符串返回True或False

Python 如果正则表达式与条件匹配,为什么代码不工作需要从字符串返回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

我编写了一个程序来查找匹配项。工作正常。如果字符串不正确,则必须返回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,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