你是如何學會正規表示式的?

時間 2021-05-06 03:02:17

1樓:一絲混亂

大部分知識和技能的都符合二八定律:20%知識點的使用頻率是80%,80%知識點的使用頻率是20%。

但是這些東西的教程或者說明是一股腦兒全部給你的,並沒有著重標出哪些是重點,哪些用的頻率不那麼高。正則就是乙個非常典型的例子,我覺得正則說是9.5 0.5都不為過。

我使用過程中,用到最多的是i g m,([u4e00-u9fa5]匹配中文次數很多) 其他用到的都不多,所以我也記不太住,真的需要用到了再去查。

2樓:

先大致看下當前要用的正則規則語法,不同的正則實現語法會不同,找些例子比較,嘗試,把具體的串慢慢改成某個範圍內可變的表示式,複雜點的需要取出或替換匹配串,正則的結果並不唯一,達到想要的效果就好。

3樓:Naive Blue

一開始是為了遮蔽b站的一些彈幕,就是那種超長一串重複字詞,比較影響觀感。

入門以後就發現了各種應用並逐漸上頭,比如從字幕檔案中提取文字稿,定製rime輸入法的縮寫和模糊音等等。

4樓:NLP小學生

說來慚愧,作為一名本碩都是電腦科學的NLP工程師,我直到工作半年後才開始正式學習正規表示式。

大二就接觸了正規表示式(在CS本科生中可能算晚的),並且買了《精通正規表示式》那本書,但由於沒有實際應用,加上自己懶惰,就沒有好好學下去。工作後,有乙個需求可以用文字模式匹配很好地解決,我才開始硬著頭皮學習正規表示式。之前沒有好好學正則還有乙個原因是畏懼心理,覺得正規表示式規則複雜,難以掌握。

但真的學下去之後發現,也就那麼回事,短時間內學到應付日常需求的程度一點也不難。

我是怎麼學的呢?穩紮穩打地學,邊學便用,邊用邊學。從基礎知識開始,先認真看完《精通正規表示式》的前三章,100多頁,大概花了一周。

然後看Python的re模組的官方文件,並記筆記Python正規表示式筆記 ,也大概用了一。完成這兩步之後,我就大概掌握了正則的語法規則和使用方法了。然後,用已有的知識實現乙個資訊抽取的問題,既是學以致用,又是在實踐中鞏固知識。

最後發現正則匹配這個方法解決那個資訊抽取問題還挺好的,又快又準。

從那之後,我就非常頻繁地使用正規表示式。主要有兩個地方,乙個是在Sublime Text 3裡用正則進行替換和查詢,令乙個是用正則進行規則分類。用多了之後對正則語法就會非常熟練了。

而用多了之後,自然就會遇到乙個效率問題,有時候正則匹配耗時很長。到了這個階段就需要了解正則的原理了,也就是有限狀態自動機。《精通正規表示式》的4、5、6章講的就挺好的。

現在我已經能游刃有餘地使用正規表示式了,越發感嘆它的強大,總覺得還有更高階的用法,只是目前還沒發現而已。還是要繼續學習。

總之,幹就完了。

5樓:Sail

正規表示式其實很簡單。因為本身概念不多,極其容易上手。困難的地方在於,當編寫的正則較長或較為複雜的時候,腦子可能有點不夠想象了。

這裡分享我的這篇文章《不再為正則煩惱》。全文從正則利器,正則基礎內容,高階內容三個方面幫助大家熟練掌握正則。正則利器部分推薦了兩個利器,形成極具效率且簡單的正則編寫工作流。

正則基礎部分幫助大家掌握正則基礎內容,比如常見的元字元、限定符等。高階部分,講解了分組、分支、貪婪與懶惰、斷言等知識點。

Sail:不再為正則煩惱

6樓:

正規表示式就那麼一點東西,經常查閱參考手冊也就會了。

對於初學者只有乙個要注意,所謂貪婪匹配與非貪婪匹配要注意,第一次學理解不了這概念。

.*?與.*區別

7樓:海拔一公尺

答案都是正規表示式教學啊?

我學這個很自然,沒什麼糾結,因為自己使用UNIX系統,而且主要是命令列方式,越來越熟練後,自然就產生了學習正規表示式的需求,一點點的就學會了。UNIX SHELL和許多其他命令列應用都支援正規表示式,學會了效率簡直會飛起來,所以就學會了。

8樓:

實踐是最好的老師

先找一些正規表示式的入門教程,一般會給出使用率比較高的表示式,記住這些基本就可以解決日常90%遇到的問題。

至於其他的,用到的時候再查吧,有的估計一輩子都用不到。

9樓:

從接收不完美開始,經驗教訓是:

不要試圖用乙個完美的regex完美表達一切feature同時又不會誤傷,正常的做法是,分段表達,分層過濾,這樣子每個表示式都清晰明確簡潔。

10樓:乾行

現在回想一下,莫名其妙的學會了正規表示式。

正規表示式在爬蟲處理、日誌處理過程中廣泛應用,可以節約大量時間。

學習正規表示式的目的是要學會爬蟲。

1. 從^.$三個元字元開始學,^表示行首、$表示行尾、.表示任意字元;

2. 最開始匹配次數用*表示,目的是匹配到結果;

3. \w可以字母、數字、下劃線_;

4. \d可以匹配0-9的數字;

5. {}用來匹配次數,比*匹配結果更準確;

6. 不斷的在工作過程中使用正規表示式,知道什麼事情可以使用正規表示式完成,在使用正規表示式完成任務的過程中遇到正規表示式分組、模式匹配等問題,再學習一遍。久而久之就會了,會得很徹底。

11樓:峰峰

首先不要去試圖理解一條複雜的表示式,因為它可以複雜到寫他的人回頭再看都不一定能一下就懂。

一種匹配可能有多個表示式都能達到目的。

應該自己從簡單的匹配開始學習,匹配幾個數字,幾個字元,開始。慢慢就會了。

12樓:number47

首先最開始接觸是用lua處理指令碼語言,在lua裡string.find或string.gsub的字串模式匹配,當然用法和正規的正則是不一樣的,功能方面比正則少很多,一些功能實現得自己操作。

之後是用csharp處理指令碼語言,有了之前lua的經驗,雖然兩者寫法不同但是還是很容易上手的。後面就用regex幹其他事,挺有用的。

13樓:

1,先找個30分鐘-1小時入門教程看一下

2,找個比較熟的人給介紹下常用的內容有哪些,正則裡面那麼多規則,很多不太常用,了解一下即可

3,一定要去寫,即使寫得很痛苦,各種忘也要寫,不會就去翻規則,教程。然後一兩個星期基本掌握

14樓:陳禮

這東西就是多學,多做,多看書理解,沒有什麼捷徑。

多做是練習反應能力,按需求拆分語句。

多學,是學習技巧,很多正則有例子。

多看書,看了就明白為什麼那麼做。

15樓:Asuka109

並沒有怎麼花時間就學會了,大概是在哪本書裡看到正則相關的介紹,覺得有用就學了下,可能也是教程寫得好很輕鬆就會了。再加上後來經常需要清洗資料,就在notepad++和vscode裡練成了正則。所以私以為掌握正則重在實踐,一開始就照著教程敲,然後再自己嘗試匹配ip html之類的格式文字,應該很快就能掌握。

況且常用的符號就那麼幾個,不用學多精就能應對大多數場景了。

16樓:Gavin

看文件,看例子。

普通的業務不需要高深的正則技巧。而且正則作為乙個文字匹配的計算很難解決全部問題。很多時候文字解析問題還是需要基本的遞迴下降演算法。不過這種情況不多見。

17樓:龍騰道默默地

正則實在是太簡單了,半個小時就會了。。。

實在不知道補充什麼,那就補充兩個用了很多年以後發現的坑吧,在寫語法分析器時非常容易碰到。

乙個是有些正則寫法會觸發指數級回溯運算,會導致服務不可用,讓你以為出bug了,但怎麼都除錯不出來——因為實際上沒有bug,只是返回值特別、特別、特別慢而已,因此很難除錯。這個一定要注意了:

constre=

s;const

str=

'char\\t'

.repeat

(100)+

'\\';re

.test

(str

);另乙個是正則裡的括號是可能導致爆棧的(似乎所有宿主環境用的都是同乙個第三方正則庫)。由於和輸入內容有關,常規測試不一定會報錯,結果留下系統隱患:

constre=

s;const

str=

'char\\t'

.repeat(10

_000_000

);re

.exec

(str);

18樓:碼月

Regex/regular expression,個人推薦在接觸工程應用之前稍微了解一下formal language的理論基礎。計算機理論中對於language, finite state machine的定義,language的decidability和recognizability,對於language的運算操作。 然後了解函式式程式設計原理中pattern matching (ocaml/python)的應用。

推薦教材 Introduction to the Theory of Computation. M. Sipser著

19樓:

在五六年前剛參加工作時,我當時的大佬說最好學一門指令碼語言,我就陰差陽錯買了一本Perl程式設計指南:

最後我Perl啥都沒學會,唯獨將裡面絕大篇幅都在介紹的正規表示式記了下來。

20樓:谷哥哥

關於哈密頓方程正規表示式的描述在很多分析力學/經典力學的書中都有,比如Goldstein的Classical Mechanics就講得比較詳細。

21樓:慧航

我是通過。。。上課學會正規表示式的!

通過給別人上課啦~

之前正規表示式用的很差,基本上都是抄一抄別人的,知道個大概但是寫的不好

真的要給別人上課的時候才撿起來系統學習、實踐的,並花了一整天的時間做了乙個講義,把常用的用法都整理、實踐了一遍,然後就,感覺學會了。

所以總結、實踐(動手)才是最快的學習方法。

當然了,前提是系統!

22樓:magic2728

第乙個要大量寫正規表示式的專案是語音識別的文字反正則化和語音合成的正則化。寫來寫去發現總是有漏洞,百思不得其解難道不管怎麼努力都不能囊括自然語言的特例嗎?

後來終於學會了FSA,FST以及他們的加權形式,才恍然大悟,這玩意對應的是狀態機程式設計,正規表示式是一種描述他們的方式,對應的是CFG,只能處理正規語言。

而人類語言,明顯是比CSG還高的圖靈機啊,處理不了也就沒什麼奇怪的了。

吳軍老師告訴我們,做事情啊,還是要用理論思維想想邊界在哪再動手,不然就會陷入痛苦的深淵。

23樓:

課程設計要求寫乙個模擬的資料庫,能識別基本sql並執行,詞法分析器懶得學,以後估計也用不著,正好不會正規表示式,就用正規表示式實現了sql增刪改查語句的識別,然後拆出各種引數,xml儲存檔案,過程不難有雙手就行,就是where條件的and or還有括號執行次序很難實現,想破頭只想出個大概,應該用遞迴實現最簡單,然而還是不好整,最後呼叫了xpath解決了。

學會之後寫一些重複文件和指令碼就開始不老實了,各種懶,各種批量操作。比如有一次資料庫需要一些選擇題的資料,直接上網搜出來題目,替換成insert語句,連轉成excel或平面檔案再匯入都省了,直接執行。

不是程式設計師但是經常需要編輯文件的人建議學習下正規表示式,這可比wps裡的萬用字元好用多了。

正規表示式匹配失敗是如何回溯的?

Belleve 在 PEG 文法裡 用後者展開即可得到以下的模式 Matcher a 是乙個函式,接入三個引數 匹配狀態 s,成功續體 success 和失敗續體 failure 在任意狀態 s 下匹配空模式 總是成功,故可以直接用封裝的 success s function Directly su...

正規表示式是圖靈完備的嗎?

理論上說,正規表示式就是符合Chomsky層級中type3文法的字串,那麼肯定是不完備的,至少連 1 n 2 n 這樣的字串都無法描述。但是實際的正規表示式引擎實現中,有時為了增強匹配字串的能力,會讓該引擎的語法達到type2乃至type0。比如Perl6的正規表示式可以完全匹配CFG type2 ...

Java正規表示式捕獲組問題?

李昂 沒有輸出顯然是因為字串中沒有匹配你pattern的,你的pattern是指1到9其中乙個數字出現一次,然後後面跟著零或多個的數字,然後後面再緊接著出現乙個或多個0。另外,你如果是是想1 9的數字出現零次或多次就得寫 0 9 而不是 0 9 d 中文居然能把正規表示式表達得這麼清楚,感覺可以用中...