如何在 python 中使用正则表达式模式检查字符串的一部分

How to check a part of string with regex pattern in python

我想检查一个字符串是否包含与给定正则表达式模式匹配的部分。 我的正则表达式是检查 IP 地址是否存在,它是这样的

regex = '''^(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.( 
            25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.( 
            25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.( 
            25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)$'''

我想检查这样的字符串中是否包含 IP 地址

url_string = "http://110.234.52.124/paypal.ca/index.html"

因为它有一个 IP 地址,我想检测它,我该怎么做?

正则表达式至少有两个问题:

  • 它包含用作格式化空格的空格,它需要 re.Xre.VERBOSE 选项才能工作
  • 这里有 ^$ 锚点需要完整的字符串匹配。您可能想使用单词边界,\b 而不是
  • 如果添加单词边界,常规字符串文字将需要双反斜杠,但如果添加 r 前缀并使其成为原始字符串文字,则只需使用 \b
  • 如果还有其他 dot-separated 个数字字符串不是 IP 需要过滤掉,您需要在开头 (?<!\d)(?<!\d\.) 而不是在开头 ^(?!\.?\d)结束而不是 $.

您可以使用

import re

regex = r'''\b(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.( 
            25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.( 
            25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.( 
            25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\b'''
url_string = "http://110.234.52.124/paypal.ca/index.html"
print( bool(re.search(regex, url_string, re.X)) )
# => True

Python demo

但是,您可以将八位字节模式定义为变量,并动态构建模式,从而无需使用 re.X 和那个长模式:

import re
o = r'(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)'
regex = fr'\b{o}(?:\.{o}){{3}}\b'
# OR regex = fr'(?<!\d)(?<!\d\.){o}(?:\.{o}){{3}}(?!\.?\d)'
url_string = "http://110.234.52.124/paypal.ca/index.html"
print( bool(re.search(regex, url_string, re.X)) )
# => True

Python demo。注意 {{3}} 周围的双大括号(在 f-string 中,文字大括号是用双大括号定义的)。

import re

regex = "(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.( \
            25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.( \
            25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.( \
            25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)"

result = re.search(regex, "http://110.234.52.124/paypal.com")

你只需要删除 ^ 和 $ 并调用这个函数 如果结果是 None 表示未找到