2017-08-10 12 views
2

使用正則表達式來提取和轉換一個語句到另一個語句的最佳方式是什麼?用於轉換的正則表達式(不使用多個語句)

具體來說,我已經實現了下面找到並從文本塊中提取sudent號並將其轉換爲:AB123CDAB-123-CD

眼下,這是實施作爲3條語句如下:

gg['student_num'] = gg['student_test'].str.extract('(\d{2})\w{3}\d{2}') + \ 
        '-' + gg['student_num'].str.extract('\d{2}(\w{3})\d{2}') + \ 
        '-' + gg['student_test'].str.extract('\d{2}\w{3}(\d{2})') 

這感覺不對,我認爲我需要有三個語句 - 每個組一個 - 串聯在一起下方(甚至更多,如果這是更復雜)和想知道如果有找到並轉換一些文本是一種更好的方法嗎?

+0

嘗試'GG [ 'student_num'] = GG [ 'student_test'] str.replace(R'(\ W {2})(\ d {3})(\ w {2})',r'\ 1- \ 2- \ 3')'。那麼,目前還不清楚數據在哪一列,只要嘗試'替換'的東西。 –

回答

2

你可以使用正則表達式得到區隔清單,然後加入他們這樣說:

'-'.join(re.search(r'(\d{2})(\w{3})(\d{2})', string).groups()) 

你可以得到AttributeError如果string不包含所需要的圖案(re.search()回報None),所以你可能想包裝這個表達式在try...except區塊中。

+0

這真是太棒了,沒有意識到團隊會像有序列表一樣出現。非常Pythonic。 – NickP

+0

確切地說,它返回一個匹配組的元組。 – bakatrouble

1

這不是正則表達式,但它是快速而簡潔:

s = "AB123CD" 

first = [i for i, a in enumerate(s) if a.isdigit()][0] 
second = [i for i, a in enumerate(s) if a.isdigit()][-1] 

new_form = s[:first]+"-"+s[first:second+1]+"-"+s[second+1:] 

輸出:

AB-123-CD 

替代正則表達式的解決方案:

letters = re.findall("[a-zA-Z]+", s) 
numbers = re.findall("[0-9]+", s) 
letters.insert(1, numbers[0]) 
final = '-'.join(letters) 
print(final) 

輸出:

AB-123-CD 
0

試試這個。希望幫助

>>> import re 
>>> s = r'ABC123DEF' 
>>> n = re.search(r'\d+',s).group() 
>>> f = re.findall(r'[A-Za-z]+',s) 
>>> new_s = f[0]+"-"+n+"-"+f[1] 
>>> new_s 

輸出:

'ABC-123-DEF' 
相關問題