正則特殊字元需要反編譯嗎
Ⅰ 深入了解Python正則表達式
前言在本節中,我們將學習更多關於如何處理正則表達式的知識。在學習了基礎知識之後,我們將更深入地了解模式元素,介紹另一種用於檢索和解析字元串的方法group()方法,介紹如何搜索同一字元串的重復出現次數,以及處理更長的文本。
正則表達式實例導入 re 模塊,將電話模式匹配為group 的一部分,並將其置於括弧中,用於獲取電話號碼,符號d用於匹配任意數字(0 到 9):
>>>match=re.search(r'Myphonenumberis([d-]+)','Myphonenumberis100-0000-0000')>>>match.group()'Myphonenumberis100-0000-0000'>>>match.group(0)'Myphonenumberis100-0000-0000'>>>match.group(1)'100-0000-0000'要定義組 group,將定義的組放在括弧中,以便後續可以單獨檢索組。使用group() 或 group(0)將獲取整個匹配項,而括弧中group 的匹配項按它們出現的順序排列,需要使用group(1)、group(2)等。
我們也可以通過編譯(compile) 模式進行匹配,並使用re.IGNORECASE選項捕獲不區分大小寫的模式,使用符號w匹配任意字母(包括數字,但不包括句點等字元符號):
>>>pattern=re.compile(r'Thejudgementofthisanswer(w+)is(wrong|correct)',re.IGNORECASE)>>>match=pattern.search('')>>>match.group()''>>>match.group(1)'five'>>>match.group(2)'wrong'>>>match.groups()('five','wrong')>>>match=pattern.search('$iswrong')>>>match.groups()Traceback(mostrecentcalllast):File"<stdin>",line1,in<mole>AttributeError:'NoneType'objecthasnoattribute'groups'使用編譯模式的優勢在於,如果需要反復多次匹配模式,可以節省時間,首先使用compile 編譯模式,然後使用該對象執行 research 方法。在編譯模式時可以添加一些額外的標志選項,用於修改模式的匹配方式,例如使用 re.IGNORECASE 使模式不區分大小寫。
匹配文本中出現的所有省和城市名,省名和城市名之間使用單個字元串分隔,且省、市名均以大寫字母開頭,使用符號s匹配任意空白字元,包括製表符和其他空白特殊字元,而使用符號. 則可以標記任意字元:
>>>pattern=re.compile(r'([A-Z][ws]+?).([A-Z][ws]+?)')>>>text='Shandong,Jinanhasareputationasafamous"springcity",Guangdong."flowercity","watertown".'>>>list(pattern.finditer(text))[<re.Matchobject;span=(0,11),match='Shandong,Ji'>,<re.Matchobject;span=(59,71),match='Guangdong.Gu'>,<re.Matchobject;span=(123,133),match='JiangsuSu'>]Ⅱ 正則表達式中^[1-9]$是什麼符號
^[1-9]表示以1到9的某位數字開頭。
d*表示0-9的任意一位或者多位或者一位。
$表示以什麼結束。
在正則表達式中,用d表示一位數字。如果再其他語言中使用過正則表達式,那你立刻就能發現java對反斜杠的不同處理。在其他語言中,\表示:我想要在正則表達式中插入一個普通的反斜杠,不給他任何特殊意義。
但是在Java中,\的意思為:我要插入一個正則表達式的反斜杠,所以其後的字元具有特殊的意義。例如,如果你想表示一位數字,那麼正則表達式應該是\d,如果你想插入一個普通的反斜杠,則應該是\\。不過換行和製表符之類的東西秩序使用單反斜線: 。
(2)正則特殊字元需要反編譯嗎擴展閱讀
正則表達式最初的想法來自兩位神經學家:沃爾特·皮茨與麥卡洛克,他們研究出了一種用數學方式來描述神經網路的模型。1956年:一位名叫Stephen Kleene的數學科學家發表了一篇題目是《神經網事件的表示法》的論文,利用稱之為正則集合的數學符號來描述此模型,引入了正則表達式的概念。
正則表達式被作為用來描述其稱之為「正則集的代數」的一種表達式,因而採用了「正則表達式」這個術語。1968年:C語言之父、UNIX之父肯·湯普森把這個「正則表達式」的理論成果用於做一些搜索演算法的研究,他描述了一種正則表達式的編譯器,於是出現了應該算是最早的正則表達式的編譯器qed(這也就成為後來的grep編輯器)。
Unix使用正則之後,正則表達式不斷的發展壯大,然後大規模應用於各種領域,根據這些領域各自的條件需要,又發展出了許多版本的正則表達式,出現了許多的分支。
把這些分支叫做「流派」。1987年:Perl語言誕生了,它綜合了其他的語言,用正則表達式作為基礎,開創了一個新的流派,Perl流派。之後很多編程語言如:Python、Java、
Ⅲ 在正則表達式中\\.和.有什麼區別
一、作為Java的轉義字元
1.在Java中,反斜杠(\)是一個特殊的字元,被稱為轉義字元,它的作用是用來轉義後面一個字元。轉義後的字元通常用於表示一個不可見的字元或具有特殊含義的字元,例如換行(\n)、回車符(\r)、製表符(\t)。
2.在Java中以下字元都有特殊意義,無法直接表示
單引號:char c = 'a'; 表示字元類型的數據時需要使用單引號將字元左右括起來。所以要表示字元'則需要使用\'
雙引號:String str = "abc"; 表示字元串類型的數據時需要使用雙引號將字元串左右括起來。要表示字元串"則需要\"
反斜杠:String regex = "你好\n\t阿"; 在Java代碼中\表示轉義字元,所以如果要表示字面意思的\,則需要使用\\
所以用反斜杠加上本身字元來進行表示。
二、在正則表達式中
2.1Java中正則表達式的\
\表示將下一字元標記為特殊字元。如\d表示數字字元匹配,等效於 [0-9]。\w表示匹配任何字類字元(字母數字下劃線),注意包括下劃線。與"[A-Za-z0-9_]"等效。
在其他語言中,\\ 表示:我想要在正則表達式中插入一個普通的(字面上的)反斜杠,請不要給它任何特殊的意義。
在 Java 中,\\ 表示:我要插入一個正則表達式的反斜線,所以其後的字元具有特殊的意義。
在 Java 中,\\ 表示:我要插入一個正則表達式的反斜線,所以其後的字元具有特殊的意義。
在 Java 中,\\ 表示:我要插入一個正則表達式的反斜線,所以其後的字元具有特殊的意義。
\\中的第一個\表示java的轉義字元\由編譯器解析,第二個\是正則表達式\由正則表達式引擎解析。
所以,在其他的語言中(如Perl),一個反斜杠 \ 就足以具有轉義的作用,而在 Java 中正則表達式中則需要有兩個反斜杠才能被解析為其他語言中的轉義作用。也可以簡單的理解在 Java 的正則表達式中,兩個 \\ 代表其他語言中的一個 \,這也就是為什麼表示一位數字的正則表達式是 \\d,而表示一個普通的反斜杠是 \\\\。
所以Java正則表達式中匹配一個普通的反斜杠是\\\\。
所以如果在[]內表示一個],要寫兩個\,即[\\]]。
例如,我要在前面不是0-9,也不是) ] }三個反括弧的後面位置中,匹配 - 的後面是數字或者正括弧( [ { 的 - 前面的位置,須寫成:
(?<![0-9)}\\]])(?=-[0-9({\\[]) 。
若在該位置加0,可寫成String s = str.replaceAll("(?<![0-9)}\\]])(?=-[0-9({\\[]) ","0");
2.2說明:
字元 說明
^ 匹配輸入字元串開始的位置。如果設置了 RegExp 對象的 Multiline 屬性,^ 還會與"\n"或"\r"之後的位置匹配。
$ 匹配輸入字元串結尾的位置。如果設置了 RegExp 對象的 Multiline 屬性,$ 還會與"\n"或"\r"之前的位置匹配。
* 零次或多次匹配前面的字元或子表達式。例如,zo* 匹配"z"和"zoo"。* 等效於 {0,}。
+ 一次或多次匹配前面的字元或子表達式。例如,"zo+"與"zo"和"zoo"匹配,但與"z"不匹配。+ 等效於 {1,}。
? 零次或一次匹配前面的字元或子表達式。例如,"do(es)?「匹配"do"或"does"中的"do」。? 等效於 {0,1}。
{n} n 是非負整數。正好匹配 n 次。例如,"o{2}"與"Bob"中的"o"不匹配,但與"food"中的兩個"o"匹配。
{n,} n 是非負整數。至少匹配 n 次。例如,"o{2,}「不匹配"Bob"中的"o」,而匹配"foooood"中的所有 o。"o{1,}「等效於"o+」。"o{0,}「等效於"o*」。
{n,m} m 和 n 是非負整數,其中 n <= m。匹配至少 n 次,至多 m 次。例如,"o{1,3}"匹配"fooooood"中的頭三個 o。『o{0,1}』 等效於 『o?』。注意:您不能將空格插入逗號和數字之間。
x y
[xyz] 字元集。匹配包含的任一字元。例如,"[abc]「匹配"plain"中的"a」。
[ ^xyz] 反向字元集。匹配未包含的任何字元。例如,"[^abc]「匹配"plain"中"p」,「l」,「i」,「n」。
[a-z] 字元范圍。匹配指定范圍內的任何字元。例如,"[a-z]"匹配"a"到"z"范圍內的任何小寫字母。
\d 數字字元匹配。等效於 [0-9]。
\D 非數字字元匹配。等效於 [ ^0-9]。
\w 匹配任何字類字元,包括下劃線。與"[A-Za-z0-9_]"等效。
\W 與任何非單詞字元匹配。與"[ ^A-Za-z0-9_]"等效。
2.3Java正則表達式的使用方法
使用正則表達式需要引入 java.util.regex 包,我們就從這里入手講解:
java.util.regex
java.util.regex 包主要包括以下三個類:
Pattern 類:
pattern 對象是一個正則表達式的編譯表示。Pattern 類沒有公共構造方法。要創建一個 Pattern 對象,你必須首先調用其公共靜態編譯方法,它返回一個 Pattern 對象。該方法接受一個正則表達式作為它的第一個參數。
Matcher 類:
Matcher 對象是對輸入字元串進行解釋和匹配操作的引擎。與Pattern 類一樣,Matcher 也沒有公共構造方法。你需要調用 Pattern 對象的 matcher 方法來獲得一個 Matcher 對象。
matches方法
PatternSyntaxException:
PatternSyntaxException 是一個非強制異常類,它表示一個正則表達式模式中的語法錯誤
Ⅳ 正則表達式為什麼會有兩個反斜杠
這要分兩步看
首先字元串中的\被編譯器解釋為
然後作為正則表達式,.又被正則表達式引擎解釋為.
如果在字元串里只寫.的話,第一步就被直接解釋為.,之後作為正則表達式被解釋時就變成匹配任意字元了。