小伙伴们,今天我们要一起探索的是Python中的一个超级神器——正则表达式(Regex),它就像是字符串处理的瑞士军刀,小巧却强大无比。别看它名字听起来高深莫测,其实掌握了几个核心模式,你也能成为字符串处理的大师。来,让我们一边玩一边学,轻松掌握这10个超实用的Python正则表达式技巧!

1. 基本匹配:从Hello World开始

import re

text = "Hello, World!"
match = re.search(r"World", text)
if match:
    print("找到啦!")
else:
    print("没找到。")

这段代码简单直接,r"World"是我们的正则表达式,告诉Python我们要找的是”World”这个字符串。re.search()在文本中寻找匹配项,找到了就打印“找到啦!”。

2. 贪心与非贪心:吃多与适可而止

text = "abracadabra"
match_greedy = re.search(r"a.*a", text)
match_nongreedy = re.search(r"a.*?a", text)

print("贪心模式:", match_greedy.group())
print("非贪心模式:", match_nongreedy.group())

贪心模式(.*)会尽可能多地匹配字符,而非贪心模式(.*?)则刚好相反,只匹配到能满足条件的最短字符串。所以,你会看到两个不同的结果。

3. 数字捕获:精准定位数字

text = "我的电话号码是123-456-7890"
phone_num = re.findall(r"\d+", text)
print("电话号码:", phone_num)

\d+是一个模式,\d代表任何数字,加号(+)表示前面的元素至少出现一次,这里用来匹配连续的数字。简单一招,电话号码就手到擒来。

4. 分组与引用:灵活运用小括号

text = "John Doe, age 30"
name, age = re.search(r"(\w+) (\d+)", text).groups()
print(f"姓名:{name}, 年龄:{age}")

小括号不简单,它们可以创建一个分组,捕获并存储匹配的文本。之后,你可以通过.groups()访问这些捕获的内容。是不是很巧妙?

5. 替换操作:改头换面

text = "Python is fun, Python is life."
new_text = re.sub(r"Python", "JavaScript", text)
print(new_text)

使用re.sub(),你可以将文本中的某些部分替换掉。这里,我们把所有的”Python”换成了”JavaScript”,体验一下语言的瞬间转换吧!

6. 邮件地址验证:精确打击

email_pattern = r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+"
text = "contact@example.com"
if re.match(email_pattern, text):
    print("有效的邮箱地址")
else:
    print("邮箱地址无效")

这个模式看起来复杂,但实际上只是遵循了邮箱地址的基本结构。感叹号,这里隐藏着正则表达式的强大逻辑能力。

7. URL提取:信息时代的淘金

url_text = "访问https://www.example.com或http://example.org"
urls = re.findall(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', url_text)
print("找到的网址:", urls)

这段代码能从文本中挖出所有URL,就像在沙子里寻找闪亮的金子。http[s]?确保它能匹配HTTP和HTTPS两种网址。

8. 重复模式:一而再,再而三

text = "aaabbcccddddd"
pattern = r"a{2,3}"  # 匹配2到3个'a'
matches = re.findall(pattern, text)
print("匹配结果:", matches)

花括号({})用来指定前面元素出现的次数。这里我们找的是连续的2到3个’a’,看看效果如何?

9. 开始与结束:边界守护

text = "Start here, but not hereEnd."
start_here = re.findall(r"^Start", text)
end_here = re.findall(r"End$", text)
print("开头的Start:", start_here)
print("结尾的End:", end_here)

^表示字符串的开始,$表示字符串的结束。这样,我们就能精确地找到位于特定位置的词。

10. 空白字符的清除:干净利落

text = "   Hello,   World!   "
clean_text = re.sub(r"\s+", " ", text).strip()
print("清理后的文本:", clean_text)

正则表达式还能帮你打扫卫生,\s+匹配任意空白字符,strip()去除两端的空白,留下一个干净的字符串。