《鬼谷八荒》NPC相關小機制介紹
文章目錄
特殊符號和字元
0x01 匹配多個正則表示式 |
管道符|
,從多個模式中選擇其一,正則模式at|home
>>> str = re.match("at|home","home")
>>> str.group()
'home'
>>> str = re.match("at|home" ,"at qaq")
>>> str.group()
'at'
0x02 匹配任意單個字元 .
點號或者句點.
符號匹配除了換行符\n
以外的任意字元(python正則表示式有一個編譯標記[S 或者 DOTALL],該標記能夠推翻這個限制,使點號能夠匹配換行符)。無論字母、數字、空格(不包括\n換行符)、可列印字元、不可列印字元,還是一個符號,使用點號都能匹配他們。
>>> str = re.match(".","a")
>>> str.group()
'a'
總結了一下常見的換行符和空格,經過測試,除了\n
- 換行符
\v \n \f
>>> print("123\v456")
123
456
>>> print("123\n456")
123
456
>>> print("123\f456")
123
456
\t
製表符,四個空格,相當於table鍵
>>> print("123\t456")
123 456
\r
將游標的位置回退到本行的開頭位置
在命令列實現倒計時功能
import time
for i in range(10 ):
print("\r離程式退出還剩%s秒" % (9-i), end="")
time.sleep(1)
0x03 從字元起始、結尾、邊界匹配
- 匹配起始位置:脫字元
^
、特殊字元\A
- 匹配末尾位置:美元符號
$
、特殊字元\Z
後者主要用於沒有脫字元的鍵盤,例如某些國際鍵盤
匹配以from起始的字串
>>> str = re.match("^from.*","from home")
>>> str.group()
'from home'
匹配以end結尾的字串
>>> str = re.match(".*end$","123end")
>>> str.group()
'123end'
\b
匹配一個字元的邊界\B
不是單詞邊界
任意以the開始的字串
\bthe
只匹配單詞the
\bthe\b
任何包含但不以the為起始的字串
\Bthe
0x04 限定範圍和否定
方括號中兩個符號中間用連字元-
連線 ,用於指定一個字元的範圍,例如 a-z、A-Z或者0-9
,如果脫字元緊跟在左方括號後面,則表示不匹配給定字元中的任意一個字元
匹配字母z後緊跟任何一個字元,然後跟一個數字
>>> re.match("z.[0-9]","z=3").group()
'z=3'
>>> re.match("[a-b][deh-j][y-z]","ahy").group()
'ahy'
匹配非母音字元
>>> re.match("[^aeiou]*","pygb").group()
'pygb'
0x04 使用閉包操作符實現存在性和頻數匹配
*
匹配左邊的表示式出現零次或者多次的情況。+
一次或多次出現的正則表示式。?
匹配零次或一次出現的正則表示式。{N}
或{M,N}
匹配前面的正則表示式N次,或匹配M-N次出現。
匹配15或者16位數字
[0-9]{15,16}
0x05 表示字符集的特殊字元
\d
匹配任何十進位制數\w
匹配全部字母數字,[A-Za-z0-9_]\s
匹配空格字元- 以上大寫版本表示不匹配,例如
\D
表示任何非十進位制數
匹配美國電話的格式例如800-555-1212
\d{3}-\d{3}-\d{4}
匹配qq郵箱
\d{5,10}@qq.com
0x06 圓括號指定分組
名字和姓氏
>>> re.match("(Mr?s?\.)?([A-Za-z]*[A-Za-z-]+)","Mr.chen").group(0)
'Mr.chen'
>>> re.match("(Mr?s?\.)?([A-Za-z]*[A-Za-z-]+)","Mr.chen").group(1)
'Mr.'
>>> re.match("(Mr?s?\.)?([A-Za-z]*[A-Za-z-]+)","Mr.chen").group(2)
'chen'
0x07 拓展表示法
沒怎麼看懂
參考《python核心程式設計》學習筆記(一):正則表示式擴充套件表示法
(?:\w+\.)*
以句點作為結尾的字串,例如“google.”、“twitter.”、“facebook.”,但是這些匹配不會儲存下來供後續的使用和資料檢索
(?#comment)
此處不做匹配,只是作為註釋
(?=.com)
如果一個字串後面跟著“.com”才做匹配操作,並不使用任何目標字串
(?!.net)
如果一個字串後面不是跟著“.net”才做匹配操作
(?<=800-)
如果字串之前為“800-”才做匹配,假定為電話號碼,同樣,並不使用任何輸入字串
(?<!192\.168\.)
如果一個字串之前不是“192.168.”才做匹配操作,用來過濾掉一組C類IP地址
(?(1)y|x)
如果一個匹配組1存在,就與y匹配,否則與x匹配
總結來看,四種斷言:
正向前行匹配(?=...)
##以某個字串結尾
負向前行匹配(?!...)
##不以某個字串結尾
正向後行匹配(?<=...)
##以某個字串開頭
負向後行匹配(?<!...)
##不以某個字串開頭
所謂的前行(lookahead)和後行(lookbehind),其實就是向前看和向後看的意思