分清字符串與字符
r與R
在Python中,前綴 r
或 R
表示原始字符串。這種原始字符串中的反斜杠字符 \
被視為普通字符,而不是轉(zhuǎn)義字符。這在處理正則表達(dá)式、文件路徑等需要保留反斜杠原始含義的情況下非常有用。
原始字符串的特點(diǎn):
-
反斜杠不進(jìn)行轉(zhuǎn)義: 在普通字符串中,反斜杠具有特殊含義,如
\n
表示換行符、\t
表示制表符等。但在原始字符串中,反斜杠只是普通字符,如\\
會(huì)被視為兩個(gè)反斜杠字符而不是轉(zhuǎn)義字符。 -
常用于正則表達(dá)式、文件路徑: 在處理正則表達(dá)式時(shí),原始字符串非常有用,因?yàn)檎齽t表達(dá)式經(jīng)常包含大量反斜杠。同時(shí),處理文件路徑時(shí),原始字符串能夠避免不必要的轉(zhuǎn)義。
示例:
正則表達(dá)式示例:
import re
# 使用原始字符串處理正則表達(dá)式
pattern = r'\b\d{3}\b' # 匹配一個(gè)三位數(shù)的單詞
text = "The code is 123 and 4567."
matches = re.findall(pattern, text)
print(matches)
文件路徑示例:
path = r'C:\Users\Username\Documents\file.txt'
with open(path, 'r') as file:
content = file.read()
print(content)
這些示例演示了如何使用 r
或 R
前綴創(chuàng)建原始字符串,以便在正則表達(dá)式或文件路徑等場(chǎng)景中保留反斜杠的原始含義。
有沒有r 帶來(lái)的影響
在Python中,使用 r
前綴與不使用 r
前綴的主要區(qū)別是,r
前綴創(chuàng)建的是一個(gè)"原始字符串",其中反斜杠 \
不會(huì)被解釋為轉(zhuǎn)義字符。這在處理正則表達(dá)式時(shí)特別有用,因?yàn)檎齽t表達(dá)式本身經(jīng)常包含大量反斜杠。
使用 r
前綴的示例:
pattern = r'(\d{4}-\d{2}-\d{2})\s\1'
這個(gè)模式是用來(lái)匹配一個(gè)日期格式(YYYY-MM-DD),然后后面跟著相同的日期格式,兩者之間有一個(gè)空格。在原始字符串中,反斜杠 \
不會(huì)被看作是轉(zhuǎn)義字符,而是作為普通字符。所以 \d
表示匹配數(shù)字字符,\s
表示匹配空白字符(空格、制表符等),\1
表示引用前面捕獲的日期格式。
不使用 r
前綴的示例:
pattern = '(\d{4}-\d{2}-\d{2})\s\1'
在這種情況下,沒有使用 r
前綴,因此反斜杠 \
會(huì)被看作是轉(zhuǎn)義字符。這可能導(dǎo)致一些意想不到的結(jié)果,因?yàn)榉葱备芎竺娴淖址赡鼙唤忉尀樘厥庾址亲置嬉饬x。 在正則表達(dá)式中,\d
代表數(shù)字字符,\s
代表空白字符,\1
引用前面捕獲的內(nèi)容。
總的來(lái)說(shuō),使用 r
前綴創(chuàng)建原始字符串通常更適合于編寫正則表達(dá)式,因?yàn)樗梢宰尫葱备茉谧址斜3衷瓨?,避免不必要的轉(zhuǎn)義。
\b 作為單詞的界限
當(dāng)使用 \b
作為單詞邊界的元字符時(shí),可以結(jié)合不同的模式以展示其作用。以下是不同用法的示例代碼:
匹配以 “cat” 開頭的單詞:
import re
text = "The cat and the catfish sat on the catwalk."
pattern_starting_with_cat = r'\bcat\w*'
matches_starting_with_cat = re.findall(pattern_starting_with_cat, text)
print("匹配以 'cat' 開頭的單詞:", matches_starting_with_cat)
這段代碼中的 r'\bcat\w*'
匹配以 “cat” 開頭的單詞。在給定文本中,它會(huì)返回以 “cat” 開頭的所有單詞,例如 “cat”, “catfish”, “catwalk”。
匹配以 “cat” 結(jié)尾的單詞:
pattern_ending_with_cat = r'\b\w*cat\b'
matches_ending_with_cat = re.findall(pattern_ending_with_cat, text)
print("匹配以 'cat' 結(jié)尾的單詞:", matches_ending_with_cat)
這段代碼中的 r'\b\w*cat\b'
匹配以 “cat” 結(jié)尾的單詞。在給定文本中,它會(huì)返回以 “cat” 結(jié)尾的所有單詞,例如 “cat”, “catfish”。
匹配整個(gè)單詞 “cat”:
pattern_entire_word = r'\bcat\b'
matches_entire_word = re.findall(pattern_entire_word, text)
print("匹配整個(gè)單詞 'cat':", matches_entire_word)
這段代碼中的 r'\bcat\b'
匹配整個(gè)單詞 “cat”。在給定文本中,它會(huì)返回所有獨(dú)立的 “cat” 單詞。
但是它不會(huì)返回“catfood"等包含"cat"的單詞
運(yùn)行這些代碼將展示 \b
作為單詞邊界的不同用法,以便更好地理解其功能。
’ .’ 匹配除’\n’外任意字符
在正則表達(dá)式中,.
是一個(gè)特殊的元字符,用于匹配除了換行符 \n
之外的任何單個(gè)字符。
用法示例:
-
匹配任何單個(gè)字符: 正則表達(dá)式
.
可以匹配任何單個(gè)字符,比如字母、數(shù)字、標(biāo)點(diǎn)符號(hào)等,除了換行符。 -
結(jié)合其他模式使用: 可以將
.
與其他模式結(jié)合使用,比如a.
可以匹配以字母 “a” 開頭,后面跟著任何一個(gè)字符的字符串。 -
貪婪匹配:
.
是貪婪的,它會(huì)盡可能多地匹配字符,直到無(wú)法匹配為止。
示例:
import re
text = "The cat sat on the mat."
pattern = r'c.t' # 匹配以 "c" 開頭,后面是任意字符,然后是 "t"
matches = re.findall(pattern, text)
print(matches) # 輸出匹配的內(nèi)容
在上述示例中,r'c.t'
這個(gè)模式將匹配字符串中以 “c” 開頭,后面跟著任意字符,然后以 “t” 結(jié)尾的部分。在給定的文本中,匹配到的是 “cat”。
.
是一個(gè)非常常用的元字符,用于捕獲或匹配大多數(shù)的單個(gè)字符,但需要注意它不能匹配換行符 \n
。
*匹配位于 * 之前的字符或者子模式0次或者多次
在正則表達(dá)式中,*
是一個(gè)量詞,用于指示其前面的模式可以出現(xiàn)零次或多次。它表示匹配前面的元素零次或多次。
用法示例:
-
匹配零次或多次:
-
a*
匹配零個(gè)或多個(gè) “a”。 -
ab*
匹配 “a” 后面跟著零個(gè)或多個(gè) “b”。例如,“a”, “ab”, “abb”, “abbb”, 等等。
-
-
貪婪匹配:
-
a*
是貪婪的
,它會(huì)盡可能多地匹配 “a”,直到無(wú)法匹配為止。
-
-
結(jié)合其他模式使用:
- 可以將
*
與其他字符結(jié)合使用,比如.*
可以匹配任意數(shù)量的任意字符(除了換行符)。
- 可以將
示例:
import re
text = "The cat sat on the mat."
pattern = r's.*t' # 匹配以 "s" 開頭,后面是零個(gè)或多個(gè)任意字符,然后以 "t" 結(jié)尾
matches = re.findall(pattern, text)
print(matches) # 輸出匹配的內(nèi)容
在上述示例中,r's.*t'
這個(gè)模式將匹配字符串中以 “s” 開頭,后面跟著零個(gè)或多個(gè)任意字符,最后以 “t” 結(jié)尾的部分。在給定的文本中,匹配到的是 “sat” 和 “sat on the mat”。
*
是一個(gè)靈活且常用的量詞,用于指示匹配其前面的模式零次或多次,以滿足靈活的匹配需求。
+ 匹配+ 之前的字符或者子模式 1次或者多次出現(xiàn)
在正則表達(dá)式中,+
是一個(gè)量詞,用于指示其前面的模式必須至少出現(xiàn)一次或多次。它表示匹配前面的元素至少一次或多次。
用法示例:
-
匹配一次或多次:
-
a+
匹配一個(gè)或多個(gè) “a”。 -
ab+
匹配 “a” 后面跟著一個(gè)或多個(gè) “b”。例如,“ab”, “abb”, “abbb”, 等等。
-
-
貪婪匹配:
-
a+
是貪婪的,它會(huì)盡可能多地匹配 “a”,直到無(wú)法匹配為止。
-
-
結(jié)合其他模式使用:
- 可以將
+
與其他字符結(jié)合使用,比如.+
可以匹配任意數(shù)量的任意字符(除了換行符)。
- 可以將
示例:
import re
text = "The cat sat on the mat."
pattern = r's.+t' # 匹配以 "s" 開頭,后面是一個(gè)或多個(gè)任意字符,然后以 "t" 結(jié)尾
matches = re.findall(pattern, text)
print(matches) # 輸出匹配的內(nèi)容
在上述示例中,r's.+t'
這個(gè)模式將匹配字符串中以 “s” 開頭,后面跟著一個(gè)或多個(gè)任意字符,最后以 “t” 結(jié)尾的部分。在給定的文本中,匹配到的是 “sat on the mat”。
+
用于指示至少要有一個(gè)或多個(gè)其前面的元素出現(xiàn),使得匹配更具體并要求至少有一次出現(xiàn)。注意:+ 號(hào)會(huì)至少匹配一次,但是* 可以至少匹配0次
- 號(hào)運(yùn)算符
在[ ]里面表示范圍
[a-z]//表示小寫字母
單單表示連接
當(dāng) -
不用作特殊含義時(shí),它只匹配連字符本身而不具備其他特殊作用。
舉例:
假設(shè)我們有一個(gè)文本字符串 “I have a 5-year-old cat”,如果我們使用模式 r'\d+-year-old'
,這個(gè)模式會(huì)匹配包含連字符的短語(yǔ),比如 “5-year-old”。
在這個(gè)例子中,-
只是表示連字符,它并沒有特殊的匹配行為。
| 或關(guān)系
在正則表達(dá)式中,|
稱為“管道符”或“豎線”,它用于表示“或”關(guān)系。在正則表達(dá)式中,|
用于匹配多個(gè)模式中的任何一個(gè)。
用法示例:
-
匹配多個(gè)模式之一:
-
cat|dog
匹配包含 “cat” 或 “dog” 中任何一個(gè)的字符串。 -
yes|no
匹配包含 “yes” 或 “no” 中任何一個(gè)的字符串。
-
-
用括號(hào)分組:
-
(cat|dog)food
匹配 “catfood” 或 “dogfood”。 -
yes(no|yes)
匹配 “yesno” 或 “yesyes”。
-
示例:
import re
text = "I have a cat and a dog."
pattern = r'cat|dog' # 匹配包含 "cat" 或 "dog" 中任何一個(gè)的字符串
matches = re.findall(pattern, text)
print(matches) # 輸出匹配的內(nèi)容
在上面的示例中,r'cat|dog'
這個(gè)模式將匹配包含 “cat” 或 “dog” 中任何一個(gè)的部分。在給定的文本中,匹配到的是 “cat” 和 “dog”。
|
是一個(gè)非常有用的元字符,允許同時(shí)匹配多個(gè)模式中的任何一個(gè),從而提供更靈活的匹配。
^ 規(guī)定開頭
在正則表達(dá)式中,^
是一個(gè)特殊的元字符,用于匹配字符串的開頭。
用法示例:
-
匹配字符串開頭:
^pattern
匹配以指定模式pattern
開頭的字符串。- 例如,
^hello
匹配以 “hello” 開頭的字符串。
- 例如,
示例:
import re
text = "hello world"
pattern = r'^hello' # 匹配以 "hello" 開頭的字符串
matches = re.findall(pattern, text)
print(matches) # 輸出匹配的內(nèi)容
在上面的示例中,r'^hello'
這個(gè)模式將匹配以 “hello” 開頭的字符串。在給定的文本中,由于 “hello” 出現(xiàn)在開頭,所以正則表達(dá)式匹配到了 “hello”。
^
在正則表達(dá)式中具有錨定作用,它表示匹配字符串的開頭位置。
$ 匹配以$ 前面的字符或者模式結(jié)束的字符串
在正則表達(dá)式中,$
是一個(gè)特殊的元字符,用于匹配字符串的結(jié)尾。
用法示例:
-
匹配字符串結(jié)尾:
pattern$
匹配以指定模式pattern
結(jié)尾的字符串。- 例如,
world$
匹配以 “world” 結(jié)尾的字符串。
- 例如,
示例:
import re
text = "hello world"
pattern = r'world$' # 匹配以 "world" 結(jié)尾的字符串
matches = re.findall(pattern, text)
print(matches) # 輸出匹配的內(nèi)容
在上面的示例中,r'world$'
這個(gè)模式將匹配以 “world” 結(jié)尾的字符串。在給定的文本中,由于 “world” 出現(xiàn)在結(jié)尾,所以正則表達(dá)式匹配到了 “world”。
$
在正則表達(dá)式中具有錨定作用,它表示匹配字符串的結(jié)尾位置。
? 的可選擇性與改變“貪心性”
在正則表達(dá)式中,?
是一個(gè)量詞,用于指示其前面的模式可以出現(xiàn)零次或一次,表示可選匹配。
用法示例:
-
匹配零次或一次(也就是選擇性):
-
colou?r
匹配 “colour” 或 “color”。在這里,ou?
表示u
可以出現(xiàn)零次或一次,使得匹配模式更加靈活。
-
-
非貪婪匹配:
-
a?
是非貪婪的,它只匹配零次或一次,盡可能少地匹配。
-
-
結(jié)合其他模式使用:
- 可以將
?
與其他字符結(jié)合使用,比如a?b
可以匹配零個(gè)或一個(gè) “a”,后面跟著 “b”。
- 可以將
示例:
import re
text = "The colour is red, but color is also acceptable."
pattern = r'colou?r' # 匹配 "colour" 或 "color"
matches = re.findall(pattern, text)
print(matches) # 輸出匹配的內(nèi)容
在上述示例中,r'colou?r'
這個(gè)模式將匹配 “colour” 或 “color”。在給定的文本中,它匹配到了 “colour” 和 “color”,因?yàn)?ou?
允許 u
出現(xiàn)零次或一次,使得模式可以匹配兩種拼寫形式。
改變貪心性
當(dāng) ?
緊跟在其他限定符(比如 *
, +
, {}
)后面時(shí),它改變限定符的默認(rèn)貪婪性,使其變?yōu)榉秦澙坊蜃钚∑ヅ洹?/p>
默認(rèn)貪婪匹配和非貪婪匹配:
-
默認(rèn)情況下,
*
,+
,{}
等限定符是貪婪的:- 它們會(huì)盡可能多地匹配文本,直到無(wú)法匹配為止。
-
在限定符后添加
?
將使其變?yōu)榉秦澙菲ヅ洌?/strong>- 這表示它們會(huì)盡可能少地匹配文本,只匹配所需的最小字符數(shù)。
示例:
import re
text = "This is a sample sentence for demonstrating non-greedy matching."
# 貪婪匹配
pattern_greedy = r'.+e'
matches_greedy = re.findall(pattern_greedy, text)
print("貪婪匹配:", matches_greedy)
# 非貪婪匹配
pattern_non_greedy = r'.+?e'
matches_non_greedy = re.findall(pattern_non_greedy, text)
print("非貪婪匹配:", matches_non_greedy)
在上述示例中,r'.+e'
是一個(gè)貪婪匹配,它會(huì)匹配盡可能多的字符直到找到以 “e” 結(jié)尾的內(nèi)容。相反,r'.+?e'
是一個(gè)非貪婪匹配,它會(huì)盡可能少地匹配字符直到找到以 “e” 結(jié)尾的內(nèi)容。在給定文本中,這兩種模式的匹配結(jié)果是不同的,一個(gè)會(huì)匹配更多的內(nèi)容,另一個(gè)會(huì)匹配更少的內(nèi)容。
\ 為轉(zhuǎn)義
在正則表達(dá)式中,反斜杠 \
是一個(gè)特殊字符,用于表示后面緊跟著的字符具有特殊含義或具有特定功能。它會(huì)改變緊跟其后的字符的解釋方式,稱為轉(zhuǎn)義字符。
下面是一些常見的用法和特殊含義:
1. 轉(zhuǎn)義特殊字符:
- 使用
\
可以讓特殊字符失去其特殊含義。比如,.
通常匹配任意字符,但\.
匹配實(shí)際的句點(diǎn)。
2. 匹配特殊字符:
-
\d
匹配一個(gè)數(shù)字字符。 -
\w
匹配一個(gè)字母、數(shù)字或下劃線字符。 -
\s
匹配任何空白字符(例如空格、制表符、換行符等)。
3. 匹配特定字符:
-
\n
匹配換行符。 -
\t
匹配制表符。 -
\r
匹配回車符。 -
\\
匹配實(shí)際的反斜杠字符。
示例:
假設(shè)有以下文本字符串:
text = "The cat and the hat sat flat on the mat."
import re
pattern = r'\st\w+' # 匹配以空格開始,后面是字母 "t",然后跟著一個(gè)或多個(gè)字母、數(shù)字或下劃線字符的內(nèi)容
matches = re.findall(pattern, text)
print(matches)
在這個(gè)示例中,r'\st\w+'
這個(gè)模式會(huì)匹配以空格開始,后面是字母 “t”,然后跟著一個(gè)或多個(gè)字母、數(shù)字或下劃線字符的內(nèi)容。在給定的文本中,這個(gè)模式匹配到的內(nèi)容是 " the"、 " the".
\num 匹配重復(fù)出現(xiàn)字符或者模式
當(dāng)使用 \num
這種形式的反向引用時(shí),num
代表著之前已經(jīng)捕獲的分組編號(hào)。這種引用可以用來(lái)匹配之前已經(jīng)出現(xiàn)的相同模式。以下是兩個(gè)示例:
示例1:匹配重復(fù)的連續(xù)數(shù)字
假設(shè)有字符串:
text = "1234 1234 5678"
使用正則表達(dá)式來(lái)匹配重復(fù)的連續(xù)數(shù)字:
import re
pattern = r'(\d+)\s\1' # 匹配重復(fù)的連續(xù)數(shù)字
matches = re.findall(pattern, text)
print(matches) # 輸出匹配的內(nèi)容
示例2:匹配重復(fù)的日期格式
假設(shè)有字符串:
text = "Today is 2023-10-10, and tomorrow is 2023-10-10 as well."
使用正則表達(dá)式來(lái)匹配重復(fù)的日期格式:
import re
pattern = r'(\d{4}-\d{2}-\d{2})\s\1' # 匹配重復(fù)的日期格式
matches = re.findall(pattern, text)
print(matches) # 輸出匹配的內(nèi)容
這兩個(gè)示例都使用了 \num
的反向引用,用來(lái)匹配先前已經(jīng)捕獲的相同模式。
\d 匹配任何數(shù)字,相當(dāng)于[0-9]
在 Python 中,\d
是一個(gè)正則表達(dá)式模式,用于匹配任何十進(jìn)制數(shù)字(0 到 9)。正則表達(dá)式是一種強(qiáng)大的文本匹配工具,\d
是其中的一個(gè)特殊標(biāo)記,表示匹配一個(gè)數(shù)字字符。
下面是一些示例,演示了如何在 Python 中使用 \d
:
示例 1:使用 re
模塊進(jìn)行匹配
import re
# 定義一個(gè)字符串
text = "The price is $20.99."
# 使用正則表達(dá)式模式匹配數(shù)字
matches = re.findall(r'\d', text)
# 打印匹配結(jié)果
print(matches) # 輸出:['2', '0', '9', '9']
示例 2:結(jié)合其他正則表達(dá)式模式
\d
可以與其他模式結(jié)合使用,例如 \d+
匹配一個(gè)或多個(gè)連續(xù)數(shù)字。
import re
text = "There are 12 cats, 3 dogs, and 8 birds."
# 匹配一個(gè)或多個(gè)數(shù)字
matches = re.findall(r'\d+', text)
# 打印匹配結(jié)果
print(matches) # 輸出:['12', '3', '8']
示例 3:使用正則表達(dá)式進(jìn)行替換
也可以使用 \d
來(lái)替換匹配的數(shù)字。
import re
text = "My phone number is 123-456-7890."
# 用 "X" 替換數(shù)字
new_text = re.sub(r'\d', 'X', text)
# 打印替換后的文本
print(new_text) # 輸出:"My phone number is XXX-XXX-XXXX."
總之,\d
是一個(gè)在正則表達(dá)式中表示匹配數(shù)字的特殊符號(hào),在 Python 的 re
模塊中可以使用它進(jìn)行文本匹配、提取或替換操作。
\D匹配任何不是數(shù)字
在 Python 的正則表達(dá)式中,\D
是一個(gè)特殊的元字符,用于匹配非數(shù)字字符。與 \d
匹配數(shù)字相反,\D
匹配除了 0 到 9 的任何非數(shù)字字符。
下面是一些示例,演示了如何在 Python 中使用 \D
:
示例 1:使用 re
模塊進(jìn)行匹配
import re
# 定義一個(gè)字符串
text = "The price is $20.99."
# 使用正則表達(dá)式模式匹配非數(shù)字字符
matches = re.findall(r'\D', text)
# 打印匹配結(jié)果
print(matches) # 輸出:['T', 'h', 'e', ' ', 'p', 'r', 'i', 'c', 'e', ' ', 'i', 's', ' ', '$', '.']
示例 2:結(jié)合其他正則表達(dá)式模式
\D
也可以與其他模式結(jié)合使用,例如 \D+
匹配一個(gè)或多個(gè)連續(xù)的非數(shù)字字符。
import re
text = "There are 12 cats, 3 dogs, and 8 birds."
# 匹配一個(gè)或多個(gè)非數(shù)字字符
matches = re.findall(r'\D+', text)
# 打印匹配結(jié)果
print(matches) # 輸出:['There are ', ' cats, ', ' dogs, and ', ' birds.']
示例 3:使用正則表達(dá)式進(jìn)行替換
同樣可以使用 \D
來(lái)替換匹配的非數(shù)字字符。
import re
text = "My phone number is 123-456-7890."
# 用 "*" 替換非數(shù)字字符
new_text = re.sub(r'\D', '*', text)
# 打印替換后的文本
print(new_text) # 輸出:"************1234567890"
總之,\D
是一個(gè)在正則表達(dá)式中表示匹配非數(shù)字字符的特殊符號(hào),在 Python 的 re
模塊中可以使用它進(jìn)行文本匹配、提取或替換操作。
\s 匹配任何空白字符
在 Python 中,\s
是一個(gè)特殊的正則表達(dá)式元字符,用于匹配空白字符??瞻鬃址梢允强崭瘛⒅票矸═ab)、換行符、回車符等在文本中不可見的空白符號(hào)。
下面是一些示例,演示了如何在 Python 中使用 \s
:
示例 1:使用 re
模塊進(jìn)行匹配
import re
# 定義一個(gè)字符串包含空白字符
text = "Hello\tWorld\nPython Regex"
# 使用正則表達(dá)式模式匹配空白字符
matches = re.findall(r'\s', text)
# 打印匹配結(jié)果
print(matches) # 輸出:['\t', '\n', ' ']
示例 2:結(jié)合其他正則表達(dá)式模式
\s
也可以與其他模式結(jié)合使用,例如 \s+
匹配一個(gè)或多個(gè)連續(xù)的空白字符。
import re
text = "This is a test"
# 匹配一個(gè)或多個(gè)空白字符
matches = re.findall(r'\s+', text)
# 打印匹配結(jié)果
print(matches) # 輸出:[' ', ' ', ' ', ' ']
示例 3:使用正則表達(dá)式進(jìn)行替換
同樣可以使用 \s
來(lái)替換匹配的空白字符。
import re
text = "Python\tis\tawesome."
# 用空格替換空白字符
new_text = re.sub(r'\s', ' ', text)
# 打印替換后的文本
print(new_text) # 輸出:"Python is awesome."
總之,\s
是一個(gè)在正則表達(dá)式中表示匹配空白字符的特殊符號(hào),在 Python 的 re
模塊中可以使用它進(jìn)行文本匹配、提取或替換操作。
\S,與\s 含義相反
\w匹配數(shù)字,字母,下劃線
在 Python 中,\w
是一個(gè)特殊的正則表達(dá)式元字符,用于匹配字母、數(shù)字或下劃線字符(即單詞字符)。\w
匹配單詞字符,包括 A-Z、a-z、0-9 和下劃線(_)。
下面是一些示例,演示了如何在 Python 中使用 \w
:
示例 1:使用 re
模塊進(jìn)行匹配
import re
# 定義一個(gè)包含單詞字符的字符串
text = "Hello, this is a sample string with 123 and _underscore."
# 使用正則表達(dá)式模式匹配單詞字符
matches = re.findall(r'\w', text)
# 打印匹配結(jié)果
print(matches) # 輸出:['H', 'e', 'l', 'l', 'o', 't', 'h', 'i', 's', 'i', 's', 'a', 's', 'a', 'm', 'p', 'l', 'e', 's', 't', 'r', 'i', 'n', 'g', 'w', 'i', 't', 'h', '1', '2', '3', 'a', 'n', 'd', '_', 'u', 'n', 'd', 'e', 'r', 's', 'c', 'o', 'r', 'e']
示例 2:結(jié)合其他正則表達(dá)式模式
\w
也可以與其他模式結(jié)合使用,例如 \w+
匹配一個(gè)或多個(gè)連續(xù)的單詞字符。
import re
text = "Words, numbers like 123, and_special_characters!"
# 匹配一個(gè)或多個(gè)單詞字符
matches = re.findall(r'\w+', text)
# 打印匹配結(jié)果
print(matches) # 輸出:['Words', 'numbers', 'like', '123', 'and_special_characters']
示例 3:使用正則表達(dá)式進(jìn)行替換
可以使用 \w
來(lái)替換匹配的單詞字符。
import re
text = "Replace these words with a single character."
# 用 "X" 替換單詞字符
new_text = re.sub(r'\w', 'X', text)
# 打印替換后的文本
print(new_text) # 輸出:"XXXXXXX XXXXX XXXX XXXX X XXXXX XXXXXXXXX."
總之,\w
是一個(gè)在正則表達(dá)式中表示匹配字母、數(shù)字或下劃線字符的特殊符號(hào),在 Python 的 re
模塊中可以使用它進(jìn)行文本匹配、提取或替換操作。
\W 與\w 含義相反
(),用于分組,提取,提取匹配
在 Python 的正則表達(dá)式中,括號(hào) ()
不是具體的匹配字符,而是一個(gè)元字符,用于多種功能,包括分組、捕獲和提取匹配等。
1. 分組
括號(hào) ()
用于創(chuàng)建一個(gè)子表達(dá)式,使其中的模式被視為一個(gè)整體,可以對(duì)其應(yīng)用量詞或進(jìn)行邏輯分組。這允許對(duì)一個(gè)組內(nèi)的模式進(jìn)行操作。例如:
import re
text = "apple pie, cherry pie, peach pie"
# 匹配 "apple", "cherry", "peach" 后面緊跟著 " pie" 的部分
matches = re.findall(r'(.*?) pie', text)
# 輸出匹配結(jié)果
print(matches) # 輸出:['apple', 'cherry', 'peach']
在這個(gè)例子中,(.*?)
是一個(gè)捕獲組,匹配任何字符零次或多次(非貪婪匹配),然后緊接著單詞 “pie”。括號(hào)將 .*?
模式分組,使得后面的 " pie" 對(duì)整個(gè)組進(jìn)行匹配。
2. 捕獲
括號(hào) ()
還用于捕獲匹配的內(nèi)容,這樣匹配的結(jié)果可以被提取出來(lái)。這種捕獲可以被后續(xù)引用或者在匹配后提取出來(lái)。例如:
import re
text = "Date: 2023-11-07"
# 匹配日期格式并進(jìn)行捕獲
match = re.search(r'Date: (\d{4}-\d{2}-\d{2})', text)
# 輸出捕獲的日期
if match:
print(match.group(1)) # 輸出:'2023-11-07'
在這個(gè)例子中,(\d{4}-\d{2}-\d{2})
是一個(gè)捕獲組,用括號(hào)捕獲了形如 “yyyy-mm-dd” 的日期格式。
3. 后向引用
捕獲組中的內(nèi)容還可以在同一個(gè)正則表達(dá)式中后向引用,用于檢索匹配到的內(nèi)容。這樣可以在正則表達(dá)式中引用之前捕獲的內(nèi)容。例如:
import re
text = "apple apple"
# 查找重復(fù)的單詞
matches = re.search(r'(\b\w+\b) \1', text)
# 輸出匹配結(jié)果
if matches:
print(matches.group()) # 輸出:"apple apple"
在這個(gè)例子中,(\b\w+\b)
捕獲一個(gè)單詞,并且 \1
匹配之前捕獲的單詞。
總的來(lái)說(shuō),括號(hào) ()
在正則表達(dá)式中用于創(chuàng)建子表達(dá)式、捕獲匹配內(nèi)容和后向引用。它們提供了強(qiáng)大的功能,可以更靈活地進(jìn)行模式匹配和提取文本信息。
{m,n}控制次數(shù)
在正則表達(dá)式中,花括號(hào) {}
用于指定模式的重復(fù)次數(shù)或者長(zhǎng)度范圍。這個(gè)元字符提供了靈活的量詞控制,允許你指定匹配的確切次數(shù)或某個(gè)范圍內(nèi)的次數(shù)。
指定重復(fù)次數(shù)
花括號(hào) {}
可以用來(lái)指定精確的重復(fù)次數(shù)。比如:
-
\d{3}
匹配恰好連續(xù)出現(xiàn) 3 次的數(shù)字。 -
\w{4}
匹配恰好包含 4 個(gè)字母、數(shù)字或下劃線的單詞字符。
import re
text = "12345, abc, 9876, xy"
# 匹配恰好連續(xù)出現(xiàn) 3 次的數(shù)字
matches = re.findall(r'\d{3}', text)
# 輸出匹配結(jié)果
print(matches) # 輸出:['123', '987']
指定范圍
花括號(hào)也可用于指定一個(gè)范圍,表示匹配次數(shù)的最小和最大值。
-
\w{2,4}
匹配包含 2 到 4 個(gè)字母、數(shù)字或下劃線的單詞字符。
import re
text = "apple, banana, grapes, pear, orange"
# 匹配包含 2 到 4 個(gè)字母的單詞
matches = re.findall(r'\w{2,4}', text)
# 輸出匹配結(jié)果
print(matches) # 輸出:['appl', 'bana', 'grap', 'pear', 'oran']
貪婪與非貪婪匹配
默認(rèn)情況下,花括號(hào)是貪婪的,會(huì)匹配盡可能長(zhǎng)的字符串。但可以使用 ?
將其變?yōu)榉秦澙菲ヅ洹?/p>
-
\d{2,4}
會(huì)匹配最長(zhǎng)的連續(xù)數(shù)字(2 到 4 位數(shù)字)。 -
\d{2,4}?
會(huì)匹配最短的連續(xù)數(shù)字(2 到 4 位數(shù)字)。
import re
text = "123456789"
# 貪婪匹配
matches_greedy = re.search(r'\d{2,4}', text)
if matches_greedy:
print(matches_greedy.group()) # 輸出:'1234'
# 非貪婪匹配
matches_non_greedy = re.search(r'\d{2,4}?', text)
if matches_non_greedy:
print(matches_non_greedy.group()) # 輸出:'12'
花括號(hào) {}
在正則表達(dá)式中提供了精確控制和靈活性,允許指定重復(fù)次數(shù)或長(zhǎng)度范圍,可以根據(jù)具體需求匹配所需的模式。
[ ] 與 [ ^ ]
在正則表達(dá)式中,方括號(hào) []
用于創(chuàng)建一個(gè)字符集,它表示一個(gè)字符可以是集合中的任何一個(gè)字符。方括號(hào)提供了一種靈活的方式來(lái)匹配特定的字符。
單個(gè)字符匹配
使用方括號(hào) []
可以指定要匹配的單個(gè)字符。例如:
-
[aeiou]
匹配任何一個(gè)元音字母(a、e、i、o、u)。 -
[123]
匹配任何一個(gè)數(shù)字 1、2 或 3。
import re
text = "apple, orange, banana"
# 匹配單詞中包含的元音字母
matches = re.findall(r'[aeiou]', text)
# 輸出匹配結(jié)果
print(matches) # 輸出:['a', 'e', 'o', 'a', 'e', 'a', 'a']
字符范圍
方括號(hào) []
還允許指定字符范圍。使用連字符 -
可以表示一個(gè)字符范圍。
-
[a-z]
匹配任何小寫字母。 -
[A-Z]
匹配任何大寫字母。 -
[0-9]
匹配任何數(shù)字字符。
import re
text = "apple123, ORANGE456, Banana789"
# 匹配字符串中的小寫字母、大寫字母和數(shù)字字符
matches_lower = re.findall(r'[a-z]', text)
matches_upper = re.findall(r'[A-Z]', text)
matches_digits = re.findall(r'[0-9]', text)
# 輸出匹配結(jié)果
print(matches_lower) # 輸出:['a', 'p', 'p', 'l', 'e']
print(matches_upper) # 輸出:['O', 'R', 'A', 'N', 'G', 'E', 'B']
print(matches_digits) # 輸出:['1', '2', '3', '4', '5', '6', '7', '8', '9']
否定字符集
在方括號(hào)內(nèi)的 ^
符號(hào)可以用來(lái)創(chuàng)建否定字符集,匹配不在集合中的字符。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-740739.html
-
[^0-9]
匹配任何不是數(shù)字的字符。
import re
text = "abc123def456ghi"
# 匹配非數(shù)字字符
matches = re.findall(r'[^0-9]', text)
# 輸出匹配結(jié)果
print(matches) # 輸出:['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
方括號(hào) []
在正則表達(dá)式中提供了一種便捷的方式來(lái)匹配指定的字符集或范圍,使得對(duì)單個(gè)字符的匹配變得非常靈活。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-740739.html
到了這里,關(guān)于python 之正則表達(dá)式詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!