使用正則表達式前移除空白:使用re.sub(r'\s+', '', text)替換strip()以確保移除所有空白字符。
正則表達式(Regular Expression接剩,簡稱regex或regexp)是一種用于匹配字符串中字符組合的模式虽风。它使用單個字符串來描述蚯窥、匹配一系列符合某個句法規(guī)則的字符串什乙。在Python中淋硝,正則表達式通過re
模塊提供,這個模塊包括各種功能強大的方法來處理字符串父能。
以下是一些基本的正則表達式用法的詳解:
1. 導(dǎo)入模塊
在使用正則表達式之前神凑,需要先導(dǎo)入Python的re
模塊。
import re
2. 基本匹配
使用re.match()
來檢查字符串是否從開始就符合正則表達式法竞。
# 檢查字符串是否完全匹配正則表達式
match = re.match(r'^\d+$', '12345') # 匹配成功耙厚,返回一個Match對象
if match:
print("匹配成功")
else:
print("匹配失敗")
3. 搜索
使用re.search()
來搜索字符串中首次出現(xiàn)的匹配項。
# 搜索字符串中首次出現(xiàn)的匹配項
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()
來根據(jù)正則表達式分割字符串。
# 根據(jù)正則表達式分割字符串
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. 正則表達式的特殊字符
-
.
:匹配任意單個字符(除了換行符)。 -
^
:匹配字符串的開始絮爷。 -
$
:匹配字符串的結(jié)束趴酣。 -
*
:匹配前面的字符零次或多次。 -
+
:匹配前面的字符一次或多次坑夯。 -
?
:匹配前面的字符零次或一次岖寞。 -
{m,n}
:匹配確定的次數(shù)值。 -
[]
:匹配括號內(nèi)的任意字符柜蜈。 -
|
:邏輯或操作符仗谆。 -
\
:轉(zhuǎn)義特殊字符或表示特殊序列。
9. 正則表達式中的斷言
-
(?=...)
:正向前瞻斷言淑履,匹配...前面的位置隶垮。 -
(?!...)
:負向前瞻斷言,匹配除了...之外的前面的位置秘噪。 -
(?<=...)
:正向后瞻斷言狸吞,匹配...后面的位置。 -
(?<!...)
:負向后瞻斷言指煎,匹配除了...之外的后面的位置蹋偏。
10. 捕獲組
使用圓括號()
來創(chuàng)建捕獲組,以便從匹配項中提取子模式贯要。
# 使用捕獲組提取信息
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))
正則表達式是一種用于匹配字符串中字符組合的模式暖侨,廣泛應(yīng)用于文本處理、搜索和數(shù)據(jù)驗證等領(lǐng)域崇渗。以下是正則表達式的一些基礎(chǔ)用法和高級技巧的詳解:
基礎(chǔ)概念
-
字符匹配:
- 普通字符:直接匹配自身字逗,如
a
匹配字符a
。 - 特殊字符:具有特殊含義宅广,如
.
匹配任意單個字符(除了換行符)葫掉。
- 普通字符:直接匹配自身字逗,如
-
字符類:
- 使用
[]
定義,匹配括號內(nèi)的任意一個字符跟狱,如[abc]
匹配a
俭厚、b
或c
。 - 范圍表示法:如
[a-z]
匹配任意小寫字母驶臊。
- 使用
-
重復(fù):
-
*
:匹配前面的元素零次或多次挪挤。 -
+
:匹配前面的元素一次或多次叼丑。 -
?
:匹配前面的元素零次或一次。 -
{n}
:精確匹配n次扛门。 -
{n,}
:至少匹配n次鸠信。 -
{n,m}
:匹配n到m次。
-
-
位置指定:
-
^
:匹配字符串的開始论寨。 -
$
:匹配字符串的結(jié)束星立。
-
-
選擇:
-
|
:邏輯或操作符,如cat|dog
匹配cat
或dog
葬凳。
-
高級用法
-
分組:
- 使用圓括號
()
創(chuàng)建捕獲組绰垂,允許你捕獲和引用匹配的文本片段。
- 使用圓括號
-
量詞修飾符:
-
*?
火焰、+?
劲装、??
:非貪婪量詞,盡可能少地匹配字符荐健。 -
*+
酱畅、++
、?+
:占有量詞江场,不允許反向回溯纺酸。
-
-
斷言:
-
(?:...)
:非捕獲組,用于組織模式但不捕獲文本址否。 -
(?=...)
:正向前瞻斷言餐蔬,確保某個位置后面能匹配某個模式。 -
(?!...)
:負向前瞻斷言佑附,確保某個位置后面不能匹配某個模式樊诺。 -
(?<=...)
:正向后瞻斷言,確保某個位置前面能匹配某個模式音同。 -
(?<!...)
:負向后瞻斷言词爬,確保某個位置前面不能匹配某個模式。
-
-
字符轉(zhuǎn)義:
- 使用反斜杠
\
轉(zhuǎn)義特殊字符或表示特殊序列权均,如\n
表示換行符顿膨。
- 使用反斜杠
-
特殊序列:
-
\d
:匹配任意數(shù)字,等價于[0-9]
叽赊。 -
\w
:匹配任意字母數(shù)字字符恋沃,等價于[a-zA-Z0-9_]
。 -
\s
:匹配任意空白字符必指。
-
-
編譯正則表達式:
- 使用
re.compile()
編譯正則表達式囊咏,提高效率,適用于多次使用同一模式。
- 使用
-
Python中的正則表達式函數(shù):
-
re.search()
:搜索字符串梅割,返回第一個匹配的對象霜第。 -
re.match()
:從字符串的開始位置匹配模式。 -
re.findall()
:找出字符串中所有匹配的子串户辞,并返回列表庶诡。 -
re.finditer()
:返回一個迭代器,每次迭代返回一個Match對象咆课。 -
re.sub()
:替換字符串中的匹配項。 -
re.split()
:根據(jù)匹配的模式分割字符串扯俱。
-
示例
import re
# 基礎(chǔ)匹配
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']
正則表達式是一種非常強大的工具书蚪,可以用于文本處理、數(shù)據(jù)清洗迅栅、網(wǎng)絡(luò)爬蟲等多種場景殊校,但也需要仔細設(shè)計以確保正確性和效率。應(yīng)根據(jù)具體需求選擇合適的模式和方法读存,掌握正則表達式的使用可以大大提高開發(fā)效率为流。