【问题标题】:How to check a part of string with regex pattern in python [duplicate]如何在python中使用正则表达式模式检查字符串的一部分[重复]
【发布时间】:2021-02-10 03:59:38
【问题描述】:

我想检查一个字符串是否包含与给定正则表达式模式匹配的某些部分。 我的正则表达式是检查 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 部分。
  • 所以,唯一的问题原来是锚。你只需要检查基本的正则表达式概念。

标签: python-3.x regex ip phishing


【解决方案1】:
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 则表示未找到

【讨论】:

  • @DhruvStan7 但它也是matcheshttp://paypal.com/11111111110.234.52.12456678 这样的字符串。
  • 好吧,因为我想找到 IP 地址的出现,无论是在任何地方
【解决方案2】:

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

  • 它包含用作格式化空格的空格,需要re.Xre.VERBOSE 选项才能工作
  • 这里有^$ 锚点,需要完整的字符串匹配。您可能想使用单词边界,\b 来代替
  • 如果您添加单词边界,常规字符串文字将需要双反斜杠,但如果您添加 r 前缀并使其成为原始字符串文字,则可以使用 \b
  • 如果还有其他不是 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 字符串中,文字括号是用双括号定义的)。

【讨论】:

  • 是的,问题是第 2 点,我错过了 /b 部分,现在它起作用了。谢谢!
猜你喜欢
  • 2021-02-15
  • 2021-03-10
  • 1970-01-01
  • 2019-07-20
  • 2021-05-21
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多