正則表達(dá)式(Regular Expression)是一種強(qiáng)大的文本模式匹配工具,常用于在字符串中查找、替換、分割等操作。在 Python 中,可以使用內(nèi)置的 re
模塊來(lái)操作正則表達(dá)式。
(ChatGPT編寫(xiě))下面是一些需要掌握的正則表達(dá)式知識(shí):
-
字符匹配:
- 普通字符:正則表達(dá)式中的普通字符(如字母、數(shù)字、特殊字符)與字符串中的對(duì)應(yīng)字符進(jìn)行匹配。
- 元字符:正則表達(dá)式中的特殊字符,如
.
(匹配任意字符)、*
(匹配前一個(gè)字符零次或多次)、+
(匹配前一個(gè)字符一次或多次)等。
-
字符類(lèi):
- 使用方括號(hào)
[]
來(lái)定義一個(gè)字符類(lèi),可以指定匹配的字符范圍。例如,[abc]
匹配字符 'a'、'b' 或 'c'。 - 可以使用連字符
-
表示范圍,例如[a-z]
匹配任意小寫(xiě)字母。 - 可以使用取反符號(hào)
^
來(lái)取反字符類(lèi),例如[^0-9]
匹配除數(shù)字之外的任意字符。
- 使用方括號(hào)
-
重復(fù)匹配:
-
*
:匹配前一個(gè)字符零次或多次。 -
+
:匹配前一個(gè)字符一次或多次。 -
?
:匹配前一個(gè)字符零次或一次。 -
{n}
:匹配前一個(gè)字符恰好 n 次。 -
{n, m}
:匹配前一個(gè)字符至少 n 次,最多 m 次。
-
-
邊界匹配:
-
^
:匹配字符串的開(kāi)頭。 -
$
:匹配字符串的結(jié)尾。 -
\b
:匹配單詞的邊界。
-
-
分組與捕獲:
- 使用小括號(hào)
()
可以創(chuàng)建一個(gè)分組,并可以對(duì)分組進(jìn)行操作,如應(yīng)用重復(fù)匹配、應(yīng)用修飾符等。 - 使用
|
可以表示多個(gè)分組的選擇。
- 使用小括號(hào)
-
貪婪與非貪婪匹配:
- 默認(rèn)情況下,正則表達(dá)式是貪婪匹配,即盡可能多地匹配字符串。
- 在重復(fù)匹配元字符后加上
?
可以實(shí)現(xiàn)非貪婪匹配,即盡可能少地匹配字符串。
-
修飾符:
-
re.IGNORECASE
或re.I
:忽略大小寫(xiě)匹配。 -
re.MULTILINE
或re.M
:多行模式,使^
和$
匹配每行的開(kāi)頭和結(jié)尾。 -
re.DOTALL
或re.S
:使.
匹配包括換行符在內(nèi)的任意字符。 -
re.VERBOSE
或re.X
:允許使用正則表達(dá)式中的空格和注釋。
-
除了以上提到的基本知識(shí),還有更多復(fù)雜的正則表達(dá)式操作,如零寬斷言、反向引用、非捕獲分組等。學(xué)習(xí)正則表達(dá)式需要不斷練習(xí)和實(shí)踐,可以參考 Python 的官方文檔和其他教程資源來(lái)深入了解和掌握正則表達(dá)式的用法。
提供幾個(gè)示例來(lái)說(shuō)明正則表達(dá)式的使用。
首先,我們需要導(dǎo)入 Python 的 re
模塊:
import re
-
字符匹配:
pattern = r"apple"
text = "I have an apple and a banana."
match = re.search(pattern, text)
if match:
print("Match found:", match.group())
else:
print("No match found.")
# Match found: apple
在這個(gè)示例中,我們使用了 re.search()
函數(shù)來(lái)查找字符串中是否有匹配的模式。r"apple"
是我們的模式,而 text
是要進(jìn)行匹配的字符串。re.search()
返回一個(gè)匹配對(duì)象,我們可以通過(guò) group()
方法提取匹配的結(jié)果。
-
字符類(lèi):
pattern = r"[aeiou]"
text = "Hello, world!"
matches = re.findall(pattern, text)
if matches:
print("Matches found:", matches)
else:
print("No matches found.")
# Matches found: ['e', 'o', 'o']
在這個(gè)示例中,我們使用了 re.findall()
函數(shù)來(lái)查找字符串中所有匹配的模式。[aeiou]
是一個(gè)字符類(lèi),它匹配任何一個(gè)元音字母。re.findall()
返回一個(gè)包含所有匹配項(xiàng)的列表。
-
重復(fù)匹配:
pattern = r"ab*c"
strings = ["ac", "abc", "abbc", "abbbc"]
for string in strings:
if re.match(pattern, string):
print("Match found:", string)
else:
print("No match found:", string)
# Match found: ac
# Match found: abc
# Match found: abbc
# No match found: abbbc
在這個(gè)示例中,我們使用了 re.match()
函數(shù)來(lái)判斷字符串是否與模式匹配。ab*c
是我們的模式,其中 *
表示前一個(gè)字符 'b' 可以出現(xiàn)零次或多次。循環(huán)遍歷 strings
列表中的字符串,并進(jìn)行匹配判斷。
-
邊界匹配:
pattern = r"\bcat\b"
text = "The cat is black. A cat is not a dog. The caterpillar is green."
matches = re.findall(pattern, text)
if matches:
print("Matches found:", matches)
else:
print("No matches found.")
# Matches found: ['cat', 'cat']
在這個(gè)示例中,我們使用了 \b
來(lái)匹配單詞的邊界。\bcat\b
匹配單獨(dú)的 "cat" 單詞。re.findall()
返回一個(gè)包含所有匹配項(xiàng)的列表。
-
分組與捕獲:
pattern = r"(\d{3})-(\d{4})"
text = "My phone number is 123-4567."
match = re.search(pattern, text)
if match:
print("Match found:", match.group())
print("Area code:", match.group(1))
print("Number:", match.group(2))
else:
print("No match found.")
# Match found: 123-4567
# Area code: 123
# Number: 4567
在這個(gè)示例中,我們使用了兩個(gè)小括號(hào) ()
來(lái)創(chuàng)建分組,并使用 \d
匹配數(shù)字。(\d{3})
匹配一個(gè)由三個(gè)數(shù)字組成的區(qū)號(hào),(\d{4})
匹配一個(gè)由四個(gè)數(shù)字組成的號(hào)碼。match.group(1)
和 match.group(2)
分別提取了匹配結(jié)果中的區(qū)號(hào)和號(hào)碼。
-
貪婪與非貪婪匹配:
pattern = r"<.*>"
text = "<p>This is a paragraph.</p><div>This is a div.</div>"
matches = re.findall(pattern, text)
if matches:
print("Matches found:", matches)
else:
print("No matches found.")
# Matches found: ['<p>This is a paragraph.</p><div>This is a div.</div>']
在這個(gè)示例中,我們使用了 <.*>
的模式進(jìn)行匹配。.*
表示匹配任意字符零次或多次。由于默認(rèn)是貪婪匹配,所以整個(gè)文本都被匹配為一個(gè)結(jié)果。如果我們想要非貪婪匹配,只需在 *
后面添加一個(gè) ?
。
pattern = r"<.*?>"
text = "<p>This is a paragraph.</p><div>This is a div.</div>"
matches = re.findall(pattern, text)
if matches:
print("Matches found:", matches)
else:
print("No matches found.")
# Matches found: ['<p>', '</p>', '<div>', '</div>']
在這個(gè)示例中,我們使用了 <.*?>
的模式進(jìn)行非貪婪匹配。.*?
表示匹配任意字符零次或多次,但盡可能少地匹配。因此,我們得到了每個(gè)標(biāo)簽的單獨(dú)匹配結(jié)果。
這些示例涵蓋了更多的正則表達(dá)式知識(shí)點(diǎn),包括分組、貪婪與非貪婪匹配。你可以根據(jù)需要繼續(xù)學(xué)習(xí)和實(shí)踐更復(fù)雜的正則表達(dá)式用法。
-
修飾符:
pattern = r"hello"
text = "Hello, world!"
match = re.search(pattern, text, re.IGNORECASE)
if match:
print("Match found:", match.group())
else:
print("No match found.")
# Match found: Hello
在這個(gè)示例中,我們使用了 re.IGNORECASE
修飾符,使匹配過(guò)程忽略大小寫(xiě)。因此,即使模式中是小寫(xiě)的 "hello",它也能匹配到文本中的 "Hello"。
pattern = r"^hello"
text = "Hello, world!\nHello, everyone!"
matches = re.findall(pattern, text, re.MULTILINE)
if matches:
print("Matches found:", matches)
else:
print("No matches found.")
# Matches found: ['Hello']
在這個(gè)示例中,我們使用了 re.MULTILINE
修飾符,使 ^
匹配每行的開(kāi)頭。因此,模式中的 "^hello" 只匹配第一行的 "Hello"。
這些示例展示了修飾符的使用,你可以根據(jù)需要選擇合適的修飾符來(lái)實(shí)現(xiàn)不同的匹配需求。
除了以上的示例,正則表達(dá)式還有很多其他功能
-
零寬斷言:
零寬斷言用于在匹配時(shí)指定位置,而不包括實(shí)際的字符。常見(jiàn)的零寬斷言包括正向肯定斷言 (?=...)
、正向否定斷言 (?!...)
、反向肯定斷言 (?<=...)
和反向否定斷言 (?<!...)
。
pattern = r"\b\w+(?=ing\b)"
text = "I'm singing while walking."
matches = re.findall(pattern, text)
if matches:
print("Matches found:", matches)
else:
print("No matches found.")
# Matches found: ['sing']
在這個(gè)示例中,我們使用了正向肯定斷言 (?=...)
,它匹配一個(gè)以 "ing" 結(jié)尾的單詞,但不包括 "ing" 部分。
pattern = r"\b(?=\w{5}\b)\w+\b"
text = "Hello world! This is a test sentence."
matches = re.findall(pattern, text)
if matches:
print("Matches found:", matches)
else:
print("No matches found.")
# Matches found: ['Hello', 'world', 'This', 'sentence']
?在這個(gè)示例中,我們使用了零寬正向斷言 (?=\w{5}\b)
,它匹配包含五個(gè)字母的單詞的單詞邊界。\w+
匹配一個(gè)或多個(gè)字母字符,\b
匹配單詞邊界。因此,我們得到了包含五個(gè)字母的單詞列表。
-
反向引用:
反向引用允許在正則表達(dá)式中引用前面匹配的內(nèi)容。可以使用 \number
來(lái)引用第 n 個(gè)分組的內(nèi)容。
pattern = r"(\w+)\s+\1"
text = "apple apple orange"
matches = re.findall(pattern, text)
if matches:
print("Matches found:", matches)
else:
print("No matches found.")
# Matches found: ['apple']
在這個(gè)示例中,我們使用了 \1
來(lái)引用第一個(gè)分組 (\w+)
匹配的內(nèi)容。(\w+)
匹配一個(gè)或多個(gè)字母或數(shù)字,\s+
匹配一個(gè)或多個(gè)空白字符,\1
引用第一個(gè)分組匹配的內(nèi)容。因此,我們得到了兩個(gè)相鄰的相同單詞 "apple"。
-
非捕獲分組:
非捕獲分組允許對(duì)分組進(jìn)行邏輯分組,但不捕獲匹配的內(nèi)容??梢允褂?(?:...)
來(lái)創(chuàng)建非捕獲分組。
pattern = r"(?:Mr|Ms|Mrs)\. (\w+)"
text = "Mr. Smith, Ms. Johnson, Mrs. Davis"
matches = re.findall(pattern, text)
if matches:
print("Matches found:", matches)
else:
print("No matches found.")
# Matches found: ['Smith', 'Johnson', 'Davis']
在這個(gè)示例中,我們使用了 (?:Mr|Ms|Mrs)\.
來(lái)創(chuàng)建非捕獲分組。它匹配 "Mr."、"Ms." 或 "Mrs.",后面跟著一個(gè)空格和一個(gè)單詞。但由于使用了非捕獲分組,我們只獲取了匹配的單詞部分。
pattern = r"(?:https?://)?(www\.\w+\.\w+)"
text = "Visit my website at https://www.example.com"
match = re.search(pattern, text)
if match:
print("Match found:", match.group())
else:
print("No match found.")
# Match found: www.example.com
在這個(gè)示例中,我們使用了非捕獲分組 (?:https?://)
來(lái)匹配可選的 "http://" 或 "https://"。(www\.\w+\.\w+)
匹配以 "www." 開(kāi)頭,后面跟著一個(gè)或多個(gè)單詞字符,然后是一個(gè)點(diǎn)和一個(gè)或多個(gè)單詞字符。我們只提取了網(wǎng)址部分,而不包括 "http://" 或 "https://"。?
-
查找和替換:
pattern = r"apple"
text = "I have an apple and a banana."
new_text = re.sub(pattern, "orange", text)
print("Updated text:", new_text)
# Updated text: I have an orange and a banana.
在這個(gè)示例中,我們使用 re.sub()
函數(shù)來(lái)查找并替換匹配的文本。"apple"
是要查找的模式,"orange"
是要替換成的新文本。re.sub()
返回替換后的新字符串。?
-
分割字符串?
pattern = r"\s+"
text = "Hello world! How are you?"
parts = re.split(pattern, text)
print("Parts:", parts)
# Parts: ['Hello', 'world!', 'How', 'are', 'you?']
在這個(gè)示例中,我們使用 re.split()
函數(shù)根據(jù)指定的模式將字符串分割成多個(gè)部分。\s+
匹配一個(gè)或多個(gè)空白字符,因此我們將字符串按照空白字符進(jìn)行分割。
---------------
以下是一些常見(jiàn)的正則表達(dá)式普通字符的示例:
-
字母和數(shù)字字符:
- 匹配小寫(xiě)字母
[a-z]
- 匹配大寫(xiě)字母
[A-Z]
- 匹配字母(大小寫(xiě)不區(qū)分)
[a-zA-Z]
- 匹配數(shù)字字符
[0-9]
- 匹配字母或數(shù)字字符
[a-zA-Z0-9]
- 匹配小寫(xiě)字母
-
字符類(lèi):
- 匹配給定的字符集合
[abc]
(匹配字符 'a'、'b' 或 'c') - 匹配不在字符集合內(nèi)的字符
[^abc]
(匹配除了字符 'a'、'b' 和 'c' 之外的任意字符) - 匹配范圍內(nèi)的字符
[a-z]
(匹配任意小寫(xiě)字母)
- 匹配給定的字符集合
-
數(shù)量限定符:
- 匹配零次或一次出現(xiàn)的字符
?
- 匹配零次或多次出現(xiàn)的字符
*
- 匹配一次或多次出現(xiàn)的字符
+
- 匹配指定次數(shù)出現(xiàn)的字符
{n}
- 匹配至少n次出現(xiàn)的字符
{n,}
- 匹配n到m次出現(xiàn)的字符
{n,m}
- 匹配零次或一次出現(xiàn)的字符
-
轉(zhuǎn)義字符:
- 匹配特殊字符本身,而不是其元字符含義
\.
,\[
,\(
,\\
等
- 匹配特殊字符本身,而不是其元字符含義
這些都是普通字符的示例,它們?cè)谡齽t表達(dá)式中按照字面意義進(jìn)行匹配。當(dāng)你希望匹配這些字符時(shí),可以直接使用它們,而不需要進(jìn)行特殊處理。當(dāng)然,如果某個(gè)普通字符與元字符重疊,你可能需要使用轉(zhuǎn)義字符來(lái)確保它的字面意義。
元字符(metacharacters)在正則表達(dá)式中具有特殊的含義和功能。它們用于定義模式中的特殊字符或字符類(lèi),以實(shí)現(xiàn)更靈活的匹配規(guī)則。以下是一些常見(jiàn)的正則表達(dá)式元字符:
-
.
(點(diǎn)號(hào)):匹配任意字符,除了換行符\n
。 -
^
(脫字符):匹配輸入字符串的開(kāi)頭。在多行模式下,它也匹配行的開(kāi)頭。 -
$
(美元符號(hào)):匹配輸入字符串的結(jié)尾。在多行模式下,它也匹配行的結(jié)尾。 -
*
(星號(hào)):匹配前面的元素零次或多次。 -
+
(加號(hào)):匹配前面的元素一次或多次。 -
?
(問(wèn)號(hào)):匹配前面的元素零次或一次。 -
{}
(花括號(hào)):指定前面的元素重復(fù)的次數(shù)。例如,{n}
表示前面的元素重復(fù) n 次,{n,}
表示前面的元素重復(fù)至少 n 次,{n,m}
表示前面的元素重復(fù) n 到 m 次。 -
[]
(方括號(hào)):定義一個(gè)字符類(lèi),匹配方括號(hào)中的任意字符。例如,[abc]
表示匹配字符 'a'、'b' 或 'c'。 -
|
(豎線):表示或的關(guān)系,用于在模式中選擇多個(gè)模式中的一個(gè)。 -
()
(圓括號(hào)):創(chuàng)建一個(gè)分組,可以對(duì)分組中的內(nèi)容進(jìn)行重復(fù)、引用或應(yīng)用其他操作。 -
\
(反斜杠):轉(zhuǎn)義字符,用于匹配特殊字符本身,或者給特殊字符賦予字面意義。
這些元字符在正則表達(dá)式中具有特殊的含義和功能,可以用于定義更復(fù)雜的匹配規(guī)則。在使用這些元字符時(shí),需要小心轉(zhuǎn)義字符的使用,以確保元字符被解釋為其特殊含義而不是字面字符。
在正則表達(dá)式中,字符匹配指的是匹配具體的字符或字符類(lèi)。以下是一些字符匹配的示例:
-
匹配具體字符:
- 匹配字符 'a':
a
- 匹配字符 'X':
X
- 匹配字符 '9':
9
- 匹配字符 'a':
-
字符類(lèi):
- 匹配任意小寫(xiě)字母:
[a-z]
- 匹配任意大寫(xiě)字母:
[A-Z]
- 匹配任意字母(大小寫(xiě)不區(qū)分):
[a-zA-Z]
- 匹配任意數(shù)字字符:
[0-9]
- 匹配特定的字符集合:
[abc]
(匹配字符 'a'、'b' 或 'c')
- 匹配任意小寫(xiě)字母:
-
轉(zhuǎn)義字符:
- 匹配特殊字符本身,而不是其元字符含義:
\.
匹配點(diǎn)號(hào),\[
匹配左方括號(hào),\\
匹配反斜杠等
- 匹配特殊字符本身,而不是其元字符含義:
-
元字符的字符類(lèi):
- 匹配任意非空白字符:
\S
- 匹配任意空白字符:
\s
- 匹配任意數(shù)字字符:
\d
- 匹配任意非數(shù)字字符:
\D
- 匹配任意單詞字符(字母、數(shù)字或下劃線):
\w
- 匹配任意非單詞字符:
\W
- 匹配任意非空白字符:
-
點(diǎn)號(hào)
.
:- 匹配除了換行符
\n
外的任意字符
- 匹配除了換行符
這些示例展示了不同方式的字符匹配。你可以根據(jù)需要選擇合適的字符或字符類(lèi),來(lái)匹配你想要的具體字符。
需要注意的是,在使用某些特殊字符時(shí),可能需要使用轉(zhuǎn)義字符 \
進(jìn)行轉(zhuǎn)義,以確保其被解釋為字面字符而不是元字符。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-487276.html
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-487276.html
到了這里,關(guān)于Python 正則表達(dá)式RE知識(shí)學(xué)習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!