1. 程式人生 > 遊戲攻略 >《鬼谷八荒》NPC相關小機制介紹

《鬼谷八荒》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),其實就是向前看和向後看的意思