「.」之間的區別,'?和正規表示式中的“*”?

「.」之間的區別,'?和正規表示式中的“*”?

我能舉個例子來說明這三個元素(這些元素稱為元字元嗎?)有何不同?

我知道這*意味著要么全有要么全無,但我不確定這是否是正確的思考方式。另一方面.?看起來一樣。它們匹配一個字符,對嗎?

答案1

你可能會感到困惑常用表達殼球

在正規表示式語法中.表示任何單一字元(通常不包括換行符),*而是量詞表示零個或多個前面的正規表示式原子(字元或群組)。?是一個量詞,表示零或前面原子的實例,或(在支援它的正規表示式變體中)修飾語將量詞行為設定為非貪婪。

在 shell glob 中,?表示單一字元(如 regex 的.),而*表示零個或多個字元的序列(相當於 regex .*)。

您可能會發現一些有用的參考資料:http://www.regular-expressions.info/quickstart.htmlhttp://mywiki.wooledge.org/glob

答案2

直接取自維基百科

? 問號表示前一個元素出現零次或一次。例如,colour?r 符合“color”和“color”。

*星號表示前面的元素出現零次或多次。例如,ab*c 符合「ac」、「abc」、「abbc」、「abbbc」等。

最大的差別是星號匹配零個或多個出現次數,而問號匹配零或一發生。比較這兩個例子:

$ printf "colour\ncolor\ncolouur\n" | egrep 'colou?r'                          
colour
color
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou*r'                          
colour
color
colouur

因為colouur字母 u (限定符 之前的前一個元素?)出現多次,所以它不與 匹配?,但與 匹配*

類似的例子:

$ printf "error\neror\ner\n" | egrep 'er?or'                                   
eror
$ printf "error\neror\ner\n" | egrep 'er*or'                                   
error
eror

來自同一維基百科頁面:

匹配任何單一字元(許多應用程式不包括換行符,並且哪些字元被視為換行符是特定於風味、字元編碼和平台的,但可以安全地假設包含換行符)。在 POSIX 方括號表達式中,點字元與文字點相符。例如,ac 符合「abc」等,但 [ac] 只符合「a」、「.」或「c」。

在我們的例子中,

$ printf "colour\ncolor\ncolouur\n" | egrep 'colo.r'                           
colour
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou.r'                          
colouur

夠恰當的是,最後一個讀作match any line that has "colou", plus any character, plus letter "r"

結論

您問過:“我知道‘*’意味著全部或全部,但我不確定這是否是正確的思考方式。另一個‘.’” &'?看起來一樣。正如您所看到的,點和星號並不完全相同。點作用於可能佔據該特定位置的任何字符,而問號作用於前面的元素。

答案3

注意:Examples provided are in Python.儘管概念保持不變。

'.'是一個匹配符號匹配任何字符,除了換行符(這也可以用re.DOTALLPython 中的參數來覆蓋)。因此它也被稱為通配符

'*'是一個量詞(定義元素出現的頻率)。是縮寫{0,}

它的意思是“匹配零個或多個”——星號前面的群組可以在文字中出現任意多次。它可以完全不存在或一遍又一遍地重複。

'?'也是一個量詞。是縮寫{0,1}

它的意思是“符合此問號之前的群組中的零個或一個。”也可以解釋為問號之前的部分是可選的

例如:

pattern = re.compile(r'(\d{2}-)?\d{10}')
mobile1 = pattern.search('My number is 91-9999988888')
mobile1.group()
Output: '91-9999988888'

mobile2 = pattern.search('My number is 9999988888')
mobile2.group()
Output: '9999988888'

在上面的例子中'?'表示前面的兩位數字是可選的。 它們可能不會出現或最多出現一次。

「.」之間的區別和 '?

'.'匹配/接受/驗證任何單一字符它在正規表示式中所處的位置。

例如:

pattern = re.compile(r'.ot')
pattern.findall('dot will identify both hot and got.')
Output: ['dot', 'hot', 'got']

'?'匹配/驗證零次或一次出現其前面的組

檢查手機號碼範例。

同樣適用於'*'.它將檢查其前面的組出現零次或多次

組合:

'.*':接受盡可能多的可用序列。貪心法

'.*?' 接受第一個匹配的序列並停止。非貪婪方法

有關更多信息,請考慮閱讀以下兩個問題...

相關內容