首頁>技術>

本文已經原作者 Amit Chaudhary 授權翻譯。

在NLP中,根據模式檢查文字或從文字中提取與特定模式匹配的內容是常見的任務。正則表示式是實現這一點的強大幫手。

NLP (Natural Language Processing) 是人工智慧(AI)的一個子領域。

儘管功能強大,但是正則表示式經常令人生畏,因為它有許多我們需要記住的命令,而且在複雜的結構中,還需要有一定的邏輯能力。

在這篇文章中,主要用示圖的方式來演示正則表示式的各種概念。目的當然是幫助大家也包括我自己建立一個關於正則表示式的心智模型。

心智模型

我們先從一個簡單的例子開始,在這個例子中,我們試圖在文字中找到cool這個單詞。

使用正則,我們只需輸入單詞'cool'作為模式,它就會匹配該單詞。

'cool'

正則表示式與我們期望的單詞'cool'匹配時,它的操作方式不是單詞級別而是字元級別,這是我們需要理清的一個點。

注意點:正則表示式在字元級別工作,而不是單詞級別。

這意味著正則表示式'cool'也將與以下句子匹配。

基本構建基塊

現在我們已經理解了關鍵點,接下來我們瞭解一下如何使用正則表示式匹配簡單字元。

特定字元

我們可以在正則表示式中指定字元,它將匹配文字中的所有例項。

例如,下面給出的正則表示式將匹配文字中所有'a'例項:

'a'

也可以使用從0到9的任何數字,來匹配數字。

'3'

請注意,預設情況下,正則表示式區分大小寫,因此以下正則表示式不匹配任何內容。

'A'
空格字元

我們可以使用特殊的轉義序列來檢測特殊字元,例如空格和換行符。

除了上述常見的,我們還有:

\r 回車\f 換頁\e 可執行模式特殊字元

正則表示式提供了一堆內建的特殊字元,這些字元可以一次匹配一組字元,這些字元以反斜槓\開頭。

模式:\d

它匹配0到9之間的數字。

注意,匹配項是一位數。因此,我們在下面有4個不同的匹配項,而不是單個數字18.04。

模式:\s

它匹配任何空格字元(空格、製表符或換行符)。

模式:\w

它匹配任何小寫字母(a到z),大寫字母(A到Z),數字(0到9)和下劃線。

模式:.

它匹配除換行符(\n)以外的任何字元。

let str = 'line 1\nline2'str.match(/./g)// 結果:["l", "i", "n", "e", " ", "1", "l", "i", "n", "e", "2"]

模式:否定

如果我我們使用上述模式的大寫形式,則表示他們否定的一面。

例如,如果\d匹配從0到9的任何數字,則\D將匹配0到9之外的任何數字。

字符集

字符集模式以[ 開始,以]結束,並匹配括號括起來的字元。例如,以下模式匹配任何字元'a', 'e', 'i', 'o' 和 'u'。

我們也可以使用以下模式來代替\d的功能。

除了指定所有數字,我們還可以使用連字符合-僅需指定開始和結束數字。因此,我們可以用[0-9]代替[0123456789]:

例如,[2-4]可用於匹配2到4(即2或3或4)之間的任何數字。

我們可以在括號內使用上面講的特殊字元。例如,匹配0到9之間的任何數字或空白字元:

下面,列出了一些通用模式及其含義。

錨點

正則表示式還具有特殊的處理程式,以使模式僅在字串的開頭或結尾時才匹配。

我們只能使用 ^ 字元來匹配以指定開始的模式。例如

同樣,我們可以在字元後使用$字元 ,表示以指定字元結尾。例如:

轉義元字元

考慮一種情況,我們要完全匹配單詞 "Mr. Stark"。

如果我們想用這樣的格式 Mr. Stark 來匹配,那麼它會產生意想不到的效果。因為我們知道.在正則表示式中有特殊的意義。

因此,如果我們想是精確匹配字元本身,則需要對特殊的元字元(如.、$等)進行轉義。

下面是元字元列表,如果直接使用它們,記住要對它們進行轉義。

^ $ . * + ? { } [ ] \ | ( )
重複類

現在我們可以對任何字元進行模式匹配,接著,我們來接觸較複雜一點的模式。

笨的方式來匹配重複字元

僅使用到目前為止所學的知識,幼稚的方法就是重複這種模式。例如,我們可以透過重複字元級模式來匹配兩位數字。

\d\d
量詞

正則表示式提供特殊的量詞來指定其前面字元的不同重複型別。

固定重複

我們可以使用{...}量詞來指定模式應重複的次數。

例如,可以將先前用於匹配兩位數字的模式修改為:

我們還可以使用相同的量詞指定重複範圍。例如,要匹配2位數或者4位數字,可以使用以下模式:

當應用於句子時,它將同時匹配4位數字和2位數字。

注意 最小和最大計數之間不應該有任何空格,例如,\d{2, 4}不工作。

靈活的量詞

正則表示式還提供了量詞*,+和? 使用它可以指定字元的靈活重複。

? 字元表示匹配 0 次或者 一次

例如,假設我們想匹配單詞“sound”和“sounds”,其中“s”是可選的。我們可以使用?量詞。

+ 字元表示匹配 一 次或者多次

例如,我們可以使用正則 \d+找到任意長度的數字。

* 字元表示匹配 0 次或者多次

在Python中的用法

Python在標準庫中提供了一個名為"re"的模組來使用正則表示式。

對原始字串的需求

要在Python中指定正則表示式,我們在r之前建立原始字串

pattern = r'\d'

為了理解為什麼我們在前面加上r,我們嘗試列印不帶**r**的表示式\t。

>>> pattern = '\t'>>> print(pattern)

可以看到,當我們不使用原始字串時,字串\t在Python中被視為製表符的跳脫字元。

現在我們把它轉換成原始字串,我們會得到我們指定的任何東西

>>> pattern = r'\t'>>> print(pattern)\t
使用 re 模組

要使用re模組,我們需要匯入它:

import re
1. re.findall

這個函式允許我們以字串列表的形式獲得所有匹配項。

import rere.findall(r'\d', '123456')// ['1', '2', '3', '4', '5', '6']
2. re.match

此函式在字串開頭搜尋模式,並將第一個匹配項作為匹配物件返回。如果沒有找到該模式,則返回None。

import rematch = re.match(r'batman', 'batman is cool')print(match)// <re.Match object; span=(0, 6), match='batman'>

使用match物件,我們可以將匹配的文字作為

print(match.group())// batman

在我們的模式不在句子開頭的情況下,我們將不會獲得任何匹配。

import rematch = re.match(r'batman', 'The batman is cool')print(match)// None
3. re.search

此函式還可以查詢模式的第一次出現,但該模式可以出現在文字中的任何位置。如果沒有找到該模式,則返回None。

import rematch = re.search(r'batman', 'the batman is cool')print(match.group())// batman

我是小智,我們下期再見,記得三連哦。

原文:https://dev.to/amitness/a-visual-to-regular-expression-i3

聽說打賞我的人最後都找到了真愛

16
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 大資料:聊聊大資料中臺架構