如何在 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.X
或 re.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
但是,您可以将八位字节模式定义为变量,并动态构建模式,从而无需使用 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 表示未找到
我想检查一个字符串是否包含与给定正则表达式模式匹配的部分。 我的正则表达式是检查 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.X
或re.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
但是,您可以将八位字节模式定义为变量,并动态构建模式,从而无需使用 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 表示未找到