【Python基础】正则表达式处理字符串

使用正则表达式前移除空白:使用re.sub(r'\s+', '', text)替换strip()以确保移除所有空白字符。

正则表达式(Regular Expression,简称regex或regexp)是一种用于匹配字符串中字符组合的模式。它使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在Python中,正则表达式通过re模块提供,这个模块包括各种功能强大的方法来处理字符串。

以下是一些基本的正则表达式用法的详解:

1. 导入模块

在使用正则表达式之前,需要先导入Python的re模块。

import re

2. 基本匹配

使用re.match()来检查字符串是否从开始就符合正则表达式。

# 检查字符串是否完全匹配正则表达式
match = re.match(r'^\d+$', '12345')  # 匹配成功,返回一个Match对象
if match:
    print("匹配成功")
else:
    print("匹配失败")

3. 搜索

使用re.search()来搜索字符串中首次出现的匹配项。

# 搜索字符串中首次出现的匹配项
search = re.search(r'\d+', 'Hello 123, how are you?')
if search:
    print("找到匹配项:", search.group())

4. 查找所有匹配

使用re.findall()来找出字符串中所有匹配的项。

# 查找字符串中所有匹配的项
findall = re.findall(r'\d+', '123, 456, 7890')
print("所有匹配项:", findall)

5. 替换

使用re.sub()来替换字符串中的匹配项。

# 替换字符串中的匹配项
sub = re.sub(r'\d+', 'XXX', 'Hello 123, goodbye 456')
print("替换后的字符串:", sub)

6. 分割

使用re.split()来根据正则表达式分割字符串。

# 根据正则表达式分割字符串
split = re.split(r'\s+', 'Hello 123, goodbye 456 world')
print("分割后的字符串列表:", split)

7. 编译正则表达式

如果需要多次使用相同的正则表达式,可以先编译它以提高效率。

# 编译正则表达式
pattern = re.compile(r'\d+')
result = pattern.findall('123 456 789')
print("编译后的匹配项:", result)

8. 正则表达式的特殊字符

  • .:匹配任意单个字符(除了换行符)。
  • ^:匹配字符串的开始。
  • $:匹配字符串的结束。
  • *:匹配前面的字符零次或多次。
  • +:匹配前面的字符一次或多次。
  • ?:匹配前面的字符零次或一次。
  • {m,n}:匹配确定的次数值。
  • []:匹配括号内的任意字符。
  • |:逻辑或操作符。
  • \:转义特殊字符或表示特殊序列。

9. 正则表达式中的断言

  • (?=...):正向前瞻断言,匹配...前面的位置。
  • (?!...):负向前瞻断言,匹配除了...之外的前面的位置。
  • (?<=...):正向后瞻断言,匹配...后面的位置。
  • (?<!...):负向后瞻断言,匹配除了...之外的后面的位置。

10. 捕获组

使用圆括号()来创建捕获组,以便从匹配项中提取子模式。

# 使用捕获组提取信息
pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})')
match = pattern.match('Today is 2023-07-22')
if match:
    print("捕获的年份:", match.group(1))
    print("捕获的月份:", match.group(2))
    print("捕获的日期:", match.group(3))

正则表达式是一种用于匹配字符串中字符组合的模式,广泛应用于文本处理、搜索和数据验证等领域。以下是正则表达式的一些基础用法和高级技巧的详解:

基础概念

  1. 字符匹配

    • 普通字符:直接匹配自身,如a匹配字符a
    • 特殊字符:具有特殊含义,如.匹配任意单个字符(除了换行符)。
  2. 字符类

    • 使用[]定义,匹配括号内的任意一个字符,如[abc]匹配abc
    • 范围表示法:如[a-z]匹配任意小写字母。
  3. 重复

    • *:匹配前面的元素零次或多次。
    • +:匹配前面的元素一次或多次。
    • ?:匹配前面的元素零次或一次。
    • {n}:精确匹配n次。
    • {n,}:至少匹配n次。
    • {n,m}:匹配n到m次。
  4. 位置指定

    • ^:匹配字符串的开始。
    • $:匹配字符串的结束。
  5. 选择

    • |:逻辑或操作符,如cat|dog匹配catdog

高级用法

  1. 分组

    • 使用圆括号()创建捕获组,允许你捕获和引用匹配的文本片段。
  2. 量词修饰符

    • *?+???:非贪婪量词,尽可能少地匹配字符。
    • *+++?+:占有量词,不允许反向回溯。
  3. 断言

    • (?:...):非捕获组,用于组织模式但不捕获文本。
    • (?=...):正向前瞻断言,确保某个位置后面能匹配某个模式。
    • (?!...):负向前瞻断言,确保某个位置后面不能匹配某个模式。
    • (?<=...):正向后瞻断言,确保某个位置前面能匹配某个模式。
    • (?<!...):负向后瞻断言,确保某个位置前面不能匹配某个模式。
  4. 字符转义

    • 使用反斜杠\转义特殊字符或表示特殊序列,如\n表示换行符。
  5. 特殊序列

    • \d:匹配任意数字,等价于[0-9]
    • \w:匹配任意字母数字字符,等价于[a-zA-Z0-9_]
    • \s:匹配任意空白字符。
  6. 编译正则表达式

    • 使用re.compile()编译正则表达式,提高效率,适用于多次使用同一模式。
  7. Python中的正则表达式函数

    • re.search():搜索字符串,返回第一个匹配的对象。
    • re.match():从字符串的开始位置匹配模式。
    • re.findall():找出字符串中所有匹配的子串,并返回列表。
    • re.finditer():返回一个迭代器,每次迭代返回一个Match对象。
    • re.sub():替换字符串中的匹配项。
    • re.split():根据匹配的模式分割字符串。

示例

import re

# 基础匹配
pattern = r'\d+'
text = 'The year is 2023 and the temperature is 25 degrees.'
matches = re.findall(pattern, text)
print(matches)  # 输出:['2023', '25']

# 使用捕获组
pattern = r'(\d{4})-(\d{2})-(\d{2})'
text = 'Today is 2023-07-22.'
match = re.match(pattern, text)
if match:
    print(match.group(1))  # 输出年份
    print(match.group(2))  # 输出月份
    print(match.group(3))  # 输出日期

# 非贪婪匹配
pattern = r'<.*?>'
text = '<div><p>Example</p></div>'
tags = re.findall(pattern, text)
print(tags)  # 输出:['<div>', '<p>']

# 正向前瞻断言
pattern = r'\b(?<=from)\w+\b'
text = 'Send the data from the server.'
matches = re.findall(pattern, text)
print(matches)  # 输出:['server']

正则表达式是一种非常强大的工具,可以用于文本处理、数据清洗、网络爬虫等多种场景,但也需要仔细设计以确保正确性和效率。应根据具体需求选择合适的模式和方法,掌握正则表达式的使用可以大大提高开发效率。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容