【python】使用正则在不规则字符串中提取出多个ip地址

正则表达式提取IP地址

ipv4地址总长度为32位,共4段,每段8位,以‘.’分割,每段为0~255的十进制数字

一、ip地址正则表达式

分段正则:

取值区间 正则 合并整理
0-9 \d
10-99 \d{2} [1-9]?\d
100-199 1\d{2} 1\d{2}
200-249 2[0-4]\d 2[0-4]\d
250-255 25[0-5] 25[0-5]

合并整理:

# 每一段的正则:
(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)

# 完整ip的正则:
r'((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)'
二、提取ip

示例字符串:

str = "123.12.12.12q we1764.12.12.76asd12.12.23.287frg45.23.278.34hrdf127.0.0.1jj255.45.45.45bghtbh43.0.76.345"
# 以上能够构成ip地址的有 ['127.0.0.1', '255.45.45.45', '123.12.12.12']
ip地址提取中可能出现的错误
  • 第一段或第四段位数超出,在匹配时直接舍去
  • 十进制数大于255,超出ip范围,在匹配时舍去第一位或最后一位而去两位使数字保持在范围内
  • findall匹配中间部分时需要将捕获组转化为非捕获组
ip地址提取思路

在从字符串中提取ip时可以将其分为开头,中间和结尾三部分:

  1. 中间部分
    判断可能符合ip地址格式的字符串部分的前后均需要至少一位非数字字符来截取。
    ip地址部分前三位只匹配数字长度为1~3位,第四段则使用ip地址的正则表达式进行匹配,避免出现第四段为大于255以上的数字时,在最终提取ip时舍去最后一位而匹配成功的情况。
    最后将分组加上非捕获符号后,使用findall匹配出中间所有符合ip地址格式的字符串,返回ip地址列表,正则表达式如下:
	r'\D(?:\d{1,3}\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}
<think>好的,用户想用Python提取不规则格式的字符串。首先,我需要回顾一下他们提供的引用内容,看看有哪些方法可以参考。 引用里提到正则表达式是主要工具,比如引用[2]详细说明了正则表达式的元字符和匹配规则,而引用[4]展示了如何提取IP地址正则模式。用户可能需要处理不同种类的数据,比如数字、日期、网址或者更复杂的模式。 另外,用户提到“不规则字符串”,可能是指没有固定格式或位置变化较大的文本。这时候,正则表达式确实是最佳选择,因为它可以灵活定义模式。例如,引用[3]中的代码通过字符串方法index来提取特定标记之间的内容,但这种方法在位置不固定时可能不适用,所以正则更可靠。 接下来,我需要考虑用户可能的实际应用场景。他们可能需要提取电话号码、日期、邮件地址或其他自定义格式的数据。需要给通用的步骤和示例代码,比如定义正则模式,使用re模块的findall或search方法。 还要注意处理多行文本和性能问题,比如在大量数据中使用迭代而不是一次性读取全部内容。同时,可能需要处理分组匹配,如引用[4]中的IP提取使用分组来精确捕获目标部分。 最后,确保代码示例清晰,包括文件读取和正则应用,并提醒关闭文件,如引用[3]中强调的。可能还需要提到第三方库如dateparser或phonenumbers,以应对更复杂的解析需求。</think>### 使用Python提取不规则字符串的方法 #### 方法1:正则表达式提取(通用型) 正则表达式是处理不规则字符串的核心工具。基本步骤: 1. **定义匹配规则**:使用元字符组合描述目标字符串特征 2. **应用re模块**:通过`findall()`或`search()`实现模式匹配 3. **处理匹配结果**:提取分组或完整匹配内容 **示例代码**(提取混合文本中的IP地址): ```python import re text = "服务器地址:192.168.1.1, 备用地址10.0.0.25,异常地址256.0.0.1" ip_pattern = r'\b((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\b' results = re.findall(ip_pattern, text) valid_ips = [match[0] for match in results] # 提取完整IP地址 print(valid_ips) # 输:['192.168.1.1', '10.0.0.25'] ``` *注:正则表达式通过边界限制`\b`和精确数值范围排除非法地址[^4]* #### 方法2:定位标记提取(特定场景) 适用于前后有固定标识但内容不规则字符串: ```python text = "成绩:Acc 87.5, Best; 实验数据:Acc 92.3, Best" str1, str2 = "Acc ", ", Best" def extract_between(text, start, end): return re.findall(fr'{re.escape(start)}(.*?){re.escape(end)}', text) print(extract_between(text, str1, str2)) # 输:['87.5', '92.3'] ``` *该方法使用非贪婪匹配`.*?`确保最小范围捕获[^3]* #### 方法3:组合特征提取(复杂场景) 对于多特征混合的字符串,可采用组合策略: ```python text = "订单号:XJ2023-08A,金额¥1,580.50,日期2023年8月15日" # 定义复合规则 patterns = { 'order_no': r'订单号:([A-Z]{2}\d{4}-\d{2}[A-Z])', 'amount': r'金额¥([\d,]+\.\d{2})', 'date': r'日期(\d{4}年\d{1,2}月\d{1,2}日)' } results = {} for key, pattern in patterns.items(): match = re.search(pattern, text) if match: results[key] = match.group(1) print(results) # 输各字段提取结果 ``` ### 关键技巧 1. **模式优化**: - 使用`r''`原始字符串避免转义问题 - 优先使用`\d`代替`[0-9]`提升可读性 - 利用`(?P<name>)`命名分组便于结果处理 2. **性能优化**: ```python # 预编译正则表达式(适用于大量数据) date_pattern = re.compile(r'\d{4}-\d{2}-\d{2}') with open('log.txt') as f: for line in f: dates = date_pattern.findall(line) ``` 3. **异常处理**: ```python try: with open('data.txt', 'r', encoding='utf-8') as f: content = f.read() except FileNotFoundError: print("文件不存在") except UnicodeDecodeError: print("编码格式错误") ``` ### 进阶方法 - **第三方库扩展**: - `dateparser`:处理复杂日期格式 - `phonenumbers`:国际电话号码解析 - `spacy`:基于NLP的实体识别 - **动态模式生成**: 当处理用户自定义格式时,可构建规则配置系统: ```python def dynamic_pattern(config): return re.compile(r'\b(' + '|'.join(config['keywords']) + r')\b') ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值