grouppython
1. python 正則表達式 groups和group有什麼區別
group和groups是兩個不同的函數。
一般,m.group(N) 返回第N組括弧匹配的字元。
而m.group() == m.group(0) == 所有匹配的字元,與括弧無關,這個是API規定的。
m.groups() 返回所有括弧匹配的字元,以tuple格式。
m.groups() == (m.group(0), m.group(1), ...)
正則表達式中,group()用來提取分組截獲的字元串,()用來分組。
組是通過 "(" 和 ")" 元字元來標識的。 "(" 和 ")" 有很多在數學表達式中相同的意思;它們一起把在它們裡面的表達式組成一組。舉個例子,你可以用重復限制符,象 *, +,?, 和 {m,n},來重復組里的內容,比如說(ab)* 將匹配零或更多個重復的 "ab"。
如果不引入括弧,整個個表達式作為一個組,是group(0)
對於題目中的例子:
m = re.match("([abc])+", "abc")
+號在括弧外面。括弧最多匹配到一個字元,要麼是a, 要麼是c,這個python引擎匹配的是末尾的c。
而m.group() == m.group(0) 這個返回的是整個匹配的字元串"abc".
2. Python 正則匹配為什麼group(1)返回為空,group(2)返回為none
你的正則從a字元串提取不到任何信息,自然列印就空白了。
3. Python分組
前言分組原理
核心:
1.不論分組鍵是數組、列表、字典、Series、函數,只要其與待分組變數的軸長度一致都可以傳入groupby進行分組。
2.默認axis=0按行分組,可指定axis=1對列分組。
對數據進行分組操作的過程可以概括為:split-apply-combine三步:
1.按照鍵值(key)或者分組變數將數據分組。
2.對於每組應用我們的函數,這一步非常靈活,可以是python自帶函數,可以是我們自己編寫的函數。
3.將函數計算後的結果聚合。
1 分組模式及其對象
1.1 分組的一般模式
三個要素:分組依據、數據來源、操作及其返回結果
df.groupby(分組依據)[數據來源].使用操作
1.2 分組依據的本質
1.3Groupby 對象
通過 ngroups 屬性,可以訪問分為了多少組:
通過 groups 屬性,可以返回從 組名映射到 組索引列表的字典:
當 size 作為 DataFrame 的屬性時,返回的是表長乘以表寬的大小,但在 groupby 對象上表示統計每個組的 元素個數:
通過 get_group 方法可以直接獲取所在組對應的行,此時必須知道組的具體名字:
1.4 分組的三大操作
分組的三大操作:聚合、變換和過濾
2.聚合函數
2.1內置聚合函數
包括如下函數: max/min/mean/median/count/all/any/idxmax/idxmin/mad/nunique/skew/quantile/sum/std/var/sem/size/prod
2.2agg 方法
【a】使用多個函數
當使用多個聚合函數時,需要用列表的形式把內置聚合函數的對應的字元串傳入,先前提到的所有字元串都是合法的。
【b】對特定的列使用特定的聚合函數
對於方法和列的特殊對應,可以通過構造字典傳入 agg 中實現,其中字典以列名為鍵,以聚合字元串或字元串列表為值。
【c】使用自定義函數
在 agg 中可以使用具體的自定義函數,需要注意傳入函數的參數是之前數據源中的列,逐列進行計算
【d】聚合結果重命名 如果想要對結果進行重命名,只需要將上述函數的位置改寫成元組,元組的第一個元素為新的名字,第二個位置為原來的函數,包括聚合字元串和自定義函數
3 變換和過濾
3.1 變換函數與 transform 方法
變 換 函 數 的 返 回 值 為 同 長 度 的 序 列, 最 常 用 的 內 置 變 換 函 數 是 累 計 函 數:cum- count/cumsum/cumprod/cummax/cummin ,它們的使用方式和聚合函數類似,只不過完成的是組內 累計操作。
3.2 組索引與過濾
過濾在分組中是對於組的過濾,而索引是對於行的過濾
組過濾作為行過濾的推廣,指的是如果對一個組的全體所在行進行統計的結果返回 True 則會被保留,False 則該組會被過濾,最後把所有未被過濾的組其對應的所在行拼接起來作為 DataFrame 返回。
在 groupby 對象中,定義了 filter 方法進行組的篩選,其中自定義函數的輸入參數為數據源構成的 DataFrame 本身,在之前例子中定義的 groupby 對象中,傳入的就是 df[['Height', 'Weight']] ,因此所有表方法和屬性 都可以在自定義函數中相應地使用,同時只需保證自定義函數的返回為布爾值即可。
4 跨列分組
4.1 apply 的引入
4.2 apply 的使用
在設計上,apply 的自定義函數傳入參數與 filter 完全一致,只不過後者只允許返回布爾值
【a】標量情況:結果得到的是 Series ,索引與 agg 的結果一致
【b】Series 情況:得到的是 DataFrame ,行索引與標量情況一致,列索引為 Series 的索引
【c】DataFrame 情況:得到的是 DataFrame ,行索引最內層在每個組原先 agg 的結果索引上,再加一層返 回的 DataFrame 行索引,同時分組結果 DataFrame 的列索引和返回的 DataFrame 列索引一致
4. python|re模塊group函數 'str' object has no attribute 'group'
import re
inputStr = "hello 123 world 456"
m = re.search(r"(?P<number>\d+)", inputStr)
if m:
g = m.group('number')
print(g)
正則表達式模塊re的其他基本用法,可自行學習。
5. python正則表達式groups和group有什麼區別
group和groups是兩個不同的函數。
一般,m.group(N)
返回第N組括弧匹配的字元。
而m.group()
==
m.group(0)
==
所有匹配的字元,與括弧無關,這個是API規定的。
m.groups()
返回所有括弧匹配的字元,以tuple格式。
m.groups()
==
(m.group(0),
m.group(1),
...)
對你給的例子:
m
=
re.match("([abc])+",
"abc")
你的+號在括弧外面。括弧最多匹配到一個字元,要麼是a,
要麼是c,這個python引擎匹配的是末尾的c。
而m.group()
==
m.group(0)
這個返回的是整個匹配的字元串"abc".
關於捕獲型括弧在正則表達式里的用法,參見相關文檔。
6. Python常用的正則表達式處理函數詳解
正則表達式是一個特殊的字元序列,用於簡潔表達一組字元串特徵,檢查一個字元串是否與某種模式匹配,使用起來十分方便。
在Python中,我們通過調用re庫來使用re模塊:
import re
下面介紹Python常用的正則表達式處理函數。
re.match函數
re.match 函數從字元串的起始位置匹配正則表達式,返回match對象,如果不是起始位置匹配成功的話,match()就返回None。
re.match(pattern, string, flags=0)
pattern:匹配的正則表達式。
string:待匹配的字元串。
flags:標志位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。具體參數為:
re.I:忽略大小寫。
re.L:表示特殊字元集 w, W, , B, s, S 依賴於當前環境。
re.M:多行模式。
re.S:即 . ,並且包括換行符在內的任意字元(. 不包括換行符)。
re.U:表示特殊字元集 w, W, , B, d, D, s, S 依賴於 Unicode 字元屬性資料庫。
re.X:為了增加可讀性,忽略空格和 # 後面的注釋。
import re #從起始位置匹配 r1=re.match('abc','abcdefghi') print(r1) #不從起始位置匹配 r2=re.match('def','abcdefghi') print(r2)運行結果:
其中,span表示匹配成功的整個子串的索引。
使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。
group(num):匹配的整個表達式的字元串,group() 可以一次輸入多個組號,這時它將返回一個包含那些組所對應值的元組。
groups():返回一個包含所有小組字元串的元組,從 1 到 所含的小組號。
import re s='This is a demo' r1=re.match(r'(.*) is (.*)',s) r2=re.match(r'(.*) is (.*?)',s) print(r1.group()) print(r1.group(1)) print(r1.group(2)) print(r1.groups()) print() print(r2.group()) print(r2.group(1)) print(r2.group(2)) print(r2.groups())運行結果:
上述代碼中的(.*)和(.*?)表示正則表達式的貪婪匹配與非貪婪匹配。
re.search函數
re.search函數掃描整個字元串並返回第一個成功的匹配,如果匹配成功則返回match對象,否則返回None。
re.search(pattern, string, flags=0)
pattern:匹配的正則表達式。
string:待匹配的字元串。
flags:標志位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。
import re #從起始位置匹配 r1=re.search('abc','abcdefghi') print(r1) #不從起始位置匹配 r2=re.search('def','abcdefghi') print(r2)運行結果:
使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。
group(num=0):匹配的整個表達式的字元串,group() 可以一次輸入多個組號,這時它將返回一個包含那些組所對應值的元組。
groups():返回一個包含所有小組字元串的元組,從 1 到 所含的小組號。
import re s='This is a demo' r1=re.search(r'(.*) is (.*)',s) r2=re.search(r'(.*) is (.*?)',s) print(r1.group()) print(r1.group(1)) print(r1.group(2)) print(r1.groups()) print() print(r2.group()) print(r2.group(1)) print(r2.group(2)) print(r2.groups())運行結果:
從上面不難發現re.match與re.search的區別:re.match只匹配字元串的起始位置,只要起始位置不符合正則表達式就匹配失敗,而re.search是匹配整個字元串,直到找到一個匹配為止。
re.compile 函數
compile 函數用於編譯正則表達式,生成一個正則表達式對象,供 match() 和 search() 這兩個函數使用。
re.compile(pattern[, flags])
pattern:一個字元串形式的正則表達式。
flags:可選,表示匹配模式,比如忽略大小寫,多行模式等。
import re #匹配數字 r=re.compile(r'd+') r1=r.match('This is a demo') r2=r.match('This is 111 and That is 222',0,27) r3=r.match('This is 111 and That is 222',8,27) print(r1) print(r2) print(r3)運行結果:
findall函數
搜索字元串,以列表形式返回正則表達式匹配的所有子串,如果沒有找到匹配的,則返回空列表。
需要注意的是,match 和 search 是匹配一次,而findall 匹配所有。
findall(string[, pos[, endpos]])
string:待匹配的字元串。
pos:可選參數,指定字元串的起始位置,默認為0。
endpos:可選參數,指定字元串的結束位置,默認為字元串的長度。
import re #匹配數字 r=re.compile(r'd+') r1=r.findall('This is a demo') r2=r.findall('This is 111 and That is 222',0,11) r3=r.findall('This is 111 and That is 222',0,27) print(r1) print(r2) print(r3)運行結果:
re.finditer函數
和 findall 類似,在字元串中找到正則表達式所匹配的所有子串,並把它們作為一個迭代器返回。
re.finditer(pattern, string, flags=0)
pattern:匹配的正則表達式。
string:待匹配的字元串。
flags:標志位,用於控制正則表達式的匹配方式,如是否區分大小寫,多行匹配等。
import re r=re.finditer(r'd+','This is 111 and That is 222') for i in r: print (i.group())運行結果:
re.split函數
將一個字元串按照正則表達式匹配的子串進行分割後,以列表形式返回。
re.split(pattern, string[, maxsplit=0, flags=0])
pattern:匹配的正則表達式。
string:待匹配的字元串。
maxsplit:分割次數,maxsplit=1分割一次,默認為0,不限次數。
flags:標志位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等。
import re r1=re.split('W+','This is 111 and That is 222') r2=re.split('W+','This is 111 and That is 222',maxsplit=1) r3=re.split('d+','This is 111 and That is 222') r4=re.split('d+','This is 111 and That is 222',maxsplit=1) print(r1) print(r2) print(r3) print(r4)運行結果:
re.sub函數
re.sub函數用於替換字元串中的匹配項。
re.sub(pattern, repl, string, count=0, flags=0)
pattern:正則中的模式字元串。
repl:替換的字元串,也可為一個函數。
string:要被查找替換的原始字元串。
count:模式匹配後替換的最大次數,默認0表示替換所有的匹配。
import re r='This is 111 and That is 222' # 刪除字元串中的數字 r1=re.sub(r'd+','',r) print(r1) # 刪除非數字的字元串 r2=re.sub(r'D','',r) print(r2)運行結果:
到此這篇關於Python常用的正則表達式處理函數詳解的文章就介紹到這了,希望大家以後多多支持!
7. python group函數有幾個返回值
一個,返回的是符合正則表達式的字元串。
group(0)返回整個字元串;
group(1)返回第一個匹配值;
group(2)返回第二個匹配值;
group(3)返回第三個匹配值。
依次類推。
8. python怎麼訪問group里的元素
你說的是python使用re後產生的group么,其實這個就是一個列表,你可以直接通過切片去訪問。
m = re.match("([abc])+", "abc")
print m.group()[0]如果解決了您的問題請採納!
如果未解決請繼續追問