小伙伴们,今天我们要一起探索的是Python中的一个超级神器——正则表达式(Regex),它就像是字符串处理的瑞士军刀,小巧却强大无比。别看它名字听起来高深莫测,其实掌握了几个核心模式,你也能成为字符串处理的大师。来,让我们一边玩一边学,轻松掌握这10个超实用的Python正则表达式技巧!
1. 基本匹配:从Hello World开始
1 import re<br><br>text = "Hello, World!"<br>match = re.search(r"World", text)<br>if match:<br> print("找到啦!")<br>else:<br> print("没找到。")
这段代码简单直接,
1 | r"World" |
是我们的正则表达式,告诉Python我们要找的是”World”这个字符串。
1 | re.search() |
在文本中寻找匹配项,找到了就打印“找到啦!”。
2. 贪心与非贪心:吃多与适可而止
1 text = "abracadabra"<br>match_greedy = re.search(r"a.*a", text)<br>match_nongreedy = re.search(r"a.*?a", text)<br><br>print("贪心模式:", match_greedy.group())<br>print("非贪心模式:", match_nongreedy.group())
贪心模式(
1 | .* |
)会尽可能多地匹配字符,而非贪心模式(
1 | .*? |
)则刚好相反,只匹配到能满足条件的最短字符串。所以,你会看到两个不同的结果。
3. 数字捕获:精准定位数字
1 text = "我的电话号码是123-456-7890"<br>phone_num = re.findall(r"\d+", text)<br>print("电话号码:", phone_num)
1 | \d+ |
是一个模式,
1 | \d |
代表任何数字,加号(
1 | + |
)表示前面的元素至少出现一次,这里用来匹配连续的数字。简单一招,电话号码就手到擒来。
4. 分组与引用:灵活运用小括号
1 text = "John Doe, age 30"<br>name, age = re.search(r"(\w+) (\d+)", text).groups()<br>print(f"姓名:{name}, 年龄:{age}")
小括号不简单,它们可以创建一个分组,捕获并存储匹配的文本。之后,你可以通过
1 | .groups() |
访问这些捕获的内容。是不是很巧妙?
5. 替换操作:改头换面
1 text = "Python is fun, Python is life."<br>new_text = re.sub(r"Python", "JavaScript", text)<br>print(new_text)
使用
1 | re.sub() |
,你可以将文本中的某些部分替换掉。这里,我们把所有的”Python”换成了”JavaScript”,体验一下语言的瞬间转换吧!
6. 邮件地址验证:精确打击
1 email_pattern = r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+"<br>text = "contact@example.com"<br>if re.match(email_pattern, text):<br> print("有效的邮箱地址")<br>else:<br> print("邮箱地址无效")
这个模式看起来复杂,但实际上只是遵循了邮箱地址的基本结构。感叹号,这里隐藏着正则表达式的强大逻辑能力。
7. URL提取:信息时代的淘金
1 url_text = "访问https://www.example.com或http://example.org"<br>urls = re.findall(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', url_text)<br>print("找到的网址:", urls)
这段代码能从文本中挖出所有URL,就像在沙子里寻找闪亮的金子。
1 | http[s]? |
确保它能匹配HTTP和HTTPS两种网址。
8. 重复模式:一而再,再而三
1 text = "aaabbcccddddd"<br>pattern = r"a{2,3}" <em># 匹配2到3个'a'</em><br>matches = re.findall(pattern, text)<br>print("匹配结果:", matches)
花括号(
1 | {} |
)用来指定前面元素出现的次数。这里我们找的是连续的2到3个’a’,看看效果如何?
9. 开始与结束:边界守护
1 text = "Start here, but not hereEnd."<br>start_here = re.findall(r"^Start", text)<br>end_here = re.findall(r"End$", text)<br>print("开头的Start:", start_here)<br>print("结尾的End:", end_here)
1 | ^ |
表示字符串的开始,
1 | $ |
表示字符串的结束。这样,我们就能精确地找到位于特定位置的词。
10. 空白字符的清除:干净利落
1 text = " Hello, World! "<br>clean_text = re.sub(r"\s+", " ", text).strip()<br>print("清理后的文本:", clean_text)
正则表达式还能帮你打扫卫生,
1 | \s+ |
匹配任意空白字符,
1 | strip() |
去除两端的空白,留下一个干净的字符串。