正則表達(dá)式的核心在于規(guī)則黎棠。
在編寫規(guī)則時(shí)晋渺,正則表達(dá)式提供了很多元字符,需要分析業(yè)務(wù)規(guī)則去考慮需要用到的元字符(太多了脓斩,不要去背啦)木西。
參考菜鳥(niǎo)教程:https://www.runoob.com/regexp/regexp-metachar.html
第1題
1- 1 識(shí)別后續(xù)的字符串:“ bat”、“ bit”随静、“ but”八千、“ hat”、“ hit” 或者“ hut”挪挤。
分析:以b或h開(kāi)頭叼丑,中間為a或i或u,以t結(jié)尾扛门,長(zhǎng)度為3.
隨機(jī)生成100個(gè)單詞鸠信,匹配輸出符合規(guī)則的單詞。
import re, random
def word_list(letter_list, length, num):
'''
生成指定字母生成的單詞集论寨。從letter_list中取length次生成一個(gè)單詞星立。
:param letter_list: 指定的字母集
:param length: 單詞長(zhǎng)度
:param num: 單詞數(shù)量
:return: 單詞集
'''
words = []
while num > 0:
num -= 1
word = random.sample(letter_list, length)
words.append(''.join(word))
return words
a = word_list(['h', 'u', 'i', 'a', 'm', 'b', 't'], 3, 100)
r = re.findall('[bh][aiu]t', ','.join(a))
print(r)
>['hit', 'bat', 'hat', 'hat']
第2題
1- 2 匹配由單個(gè)空格分隔的任意單詞對(duì), 也就是姓和名葬凳。
分析:姓和名都應(yīng)該以大寫字母開(kāi)頭绰垂,且名字中只能包含字母。
import re, random
def name_list(surname_list, given_name_list, num):
'''
每次從surname和given_name中隨機(jī)選取一個(gè)字符串火焰,生成一組姓名組合劲装,以空格分隔姓和名
random.choice(列表)可以實(shí)現(xiàn)隨機(jī)選取
:param surname_list: 姓的列表
:param given_name_list: 名的列表
:param num: name_list的長(zhǎng)度
:return: 姓名列表
'''
names = []
while num > 0:
num -= 1
name = random.choice(surname_list) + ' ' + random.choice(given_name_list)
names.append(name)
return names
a = name_list(['Hark', 'Ivens', 'Johnson', '889Jak'], ['Ross', 'Julie', 'Gloria', 'Carol'], 5)
print(a)
for i in a:
patt = re.findall(r'^[A-Z][a-z]+\s[A-Z][a-z]+$', i)
if len(patt) != 0:
print(patt)
>結(jié)果:
['889Jak Gloria', 'Hark Gloria', 'Ivens Gloria', '889Jak Carol', 'Johnson Julie']
['Hark Gloria']
['Ivens Gloria']
['Johnson Julie']
第3題
1- 3 匹配由單個(gè)逗號(hào)和單個(gè)空白符分隔的任何單詞和單個(gè)字母,如姓氏的
首字母昌简。
分析:如:“Tom, a, Yaml, dance, B, 11, c”.根據(jù)我對(duì)題目的理解占业,應(yīng)該輸出Tom, a 和 dance, B。
import re
a = 'Tom, a, 11, r, dance, B, sing, cc'
r = re.findall('[a-z]{2,},\s[a-z]', a, re.I)
print(r)
結(jié)果:事實(shí)上這個(gè)結(jié)果并不滿足我理解的題意纯赎,但是目前搞不定
['Tom, a', 'dance, B', 'sing, c']
第4題
1- 4 匹配所有有效 Python 標(biāo)識(shí)符的集合谦疾。
分析:標(biāo)識(shí)符不能與關(guān)鍵字同名,由下劃線犬金、字母念恍、數(shù)字組成六剥,必須以下劃線或字母開(kāi)頭。
如:__init峰伙、a_b疗疟、test1等為有效標(biāo)識(shí)符
11_a為無(wú)效標(biāo)識(shí)符
知識(shí)點(diǎn)說(shuō)明:\w在不加re.A時(shí)可以匹配出中文,是因?yàn)閜ython3支持的是Unicode字符集词爬。加re.A可以僅支持中文秃嗜。
import re
import keyword
a = ['11_a', 'in', 'as', 'import','__flag__', '__fl#ag__', 'd', '123', '1_b', '__a字母a', '_1_a', '_1_a_#']
# 判斷字符串是否與關(guān)鍵字同名
b = [flag for flag in a if flag not in keyword.kwlist]
r = [re.findall('^[a-z_]\w*$', flag, re.I | re.A) for flag in b]
print(r)
g = filter(lambda x: len(x) != 0, r)
print(list(g))
結(jié)果:
[[], ['__flag__'], [], ['d'], [], [], [], ['_1_a'], []]
[['__flag__'], ['d'], ['_1_a']]
第5題
1- 5 根據(jù)讀者當(dāng)?shù)氐母袷饺ňヅ浣值赖刂罚ㄊ鼓愕恼齽t表達(dá)式足夠通用顿膨,來(lái)匹配任意數(shù)量的街道單詞,包括類型名稱)叽赊。例如恋沃,美國(guó)街道地址使用如下格式:1180 Bordeaux Drive。使你的正則表達(dá)式足夠靈活必指,以支持多單詞的街道名稱囊咏,如3120 De la Cruz Boulevard。
分析:匹配每個(gè)地址是否是街道地址塔橡,街道地址以4位數(shù)字開(kāi)頭梅割,多個(gè)單詞組成,每組單詞之間由空格隔開(kāi)葛家。