Python正则表达式组合匹配返回None问题求助
问题解决
你的正则匹配返回None的原因有两个:
re.match从字符串开头开始匹配,但目标语句statement最前面有空格,你的正则没匹配这部分内容,导致直接匹配失败。- 虽然用了
re.VERBOSE模式可以忽略正则里的换行和注释,但它不会自动处理目标字符串里的前置空格。
修改后的代码如下:
import re pattern = """ ^\s* # 匹配开头的任意空白字符(包括空格、换行) (?P<host>[0-9]{3}\.[0-9]{3}\.[0-9]{3}\.[0-9]{3}) - (?P<user_name>\w*) \s+ # 匹配用户名和时间之间的空格 (?P<time>\[.*?\]) \s+ # 匹配时间和请求之间的空格 (?P<Request>\".*?\") """ statement = """ 146.204.224.152 - feest6811 [21/Jun/2019:15:45:24 -0700] "POST /incentivize HTTP/1.1" """ item = re.match(pattern, statement, re.VERBOSE) print(item.groupdict())
运行后会输出符合预期的字典:
{'host': '146.204.224.152', 'user_name': 'feest6811', 'time': '[21/Jun/2019:15:45:24 -0700]', 'Request': '"POST /incentivize HTTP/1.1"'}
补充说明:
- 加上
^\s*匹配字符串开头的所有空白,解决了前置空格的问题。 - 把正则里的空格换成
\s+,确保匹配目标字符串中变量之间的任意数量空格(避免因空格数量不一致导致匹配失败)。 - 去掉了
re.IGNORECASE,因为你的正则里没有大小写相关的匹配需求,没必要开启。
内容的提问来源于stack exchange,提问作者Ayesha
相关产品推荐
相关产品推荐

