1. 程式人生 > >正則匹配以xx開頭以xx結尾的單詞

正則匹配以xx開頭以xx結尾的單詞

在字串處理中,正則表示式是一大利器,但其對於初學者而言是存在一定的難度的。
而如何匹配以xx開頭以xx結尾的單詞呢?

假設需要匹配的字串為:site sea sue sweet see case sse ssee loses
需要匹配的為以s開頭以e 結尾的單詞。
正確的正則式為:\bs\S*?e\b

無論什麼語言的正則的格式都一樣,下面以python為例來進行程式碼演示:
解釋一下:在python中re.findall函式表示匹配字串中所有的可能選項,findall()裡面第一個r表示row,忽略正則式中所有的轉義。

text ='site sea sue sweet see case sse ssee loses'
re.findall(r'\bs\S*?e\b',text)

結果為:['site', 'sue', 'see', 'sse', 'ssee']

下面來解釋一下:\b 代表單詞的開始或結束,常由標點符號、空格、換行等來作為分隔符
如果前後不加\b,即正則表示式為:s\S*?e
執行結果就變成了
['site', 'se', 'sue', 'swe', 'se', 'se', 'sse', 'sse', 'se']
這樣匹配出來的就是不保證單詞的完整性,只要某一個單詞中含有s*e都會輸出來。

\S表示任意非空字元,在這個問題中很容易想到的正則表示式是\bs.*?e\b ,即將\S

寫成.,但是這就會導致另外一種情況,這種情況的輸出為:

['site', 'sea sue', 'sweet see', 'sse', 'ssee']

可以看見出現了sea sue 等不是我們所期望的情況出現。

而至於* 自然是表示匹配任意多個字元。
而使用\S*? 是為什麼呢,為什麼要加 呢?這就涉及到正則表示式的懶惰模式了。
如果使用.* 表示的就是貪婪模式,而.*? 表示的就是懶惰模式。
貪婪模式下會盡量匹配最長的字串,而懶惰模式會盡量匹配最短的字串。
舉個栗子:
對於字串abcgabc

貪婪模式– a.*c –得到的答案為:abcgabc
懶惰模式– a.*?c

–得到的答案為:abc,abc

例子參考的是學習python的一個網站——Crossing的程式設計教室

歡迎大家加入QQ群一起交流討論,「吟遊」程式人生——YinyouPoet

相關推薦

匹配xx開頭xx結尾單詞(轉載)

在字串處理中,正則表示式是一大利器,但其對於初學者而言是存在一定的難度的。 而如何匹配以xx開頭以xx結尾的單詞呢? 假設需要匹配的字串為:site sea sue sweet see case sse ssee loses 需要匹配的為以s開頭以e 結尾的單詞。 正確

匹配xx開頭xx結尾單詞

在字串處理中,正則表示式是一大利器,但其對於初學者而言是存在一定的難度的。 而如何匹配以xx開頭以xx結尾的單詞呢? 假設需要匹配的字串為:site sea sue sweet see case sse ssee loses 需要匹配的為以s開頭以e 結尾

匹配輸入只能包含小寫字母和.,字母開頭/結尾

ava pub mat 字母 group ssss str out main import java.util.regex.Matcher;import java.util.regex.Pattern;public class CC { public static v

linux表達式,(grep為例)

ant per egrep 大小寫 則表達式 spa 表示 中括號 第四章 第一章 基礎正則表達式^word 匹配以word開頭的內容word$ 匹配以我word結尾的內容^$ 表示空行. 代表有且只代表任意一個字符\ 轉義符號,例如. 就只代表點本身,讓有著特殊身份意義

python中匹配字符配置單詞邊界不生效的解決辦法

re python duoceshi #-*-coding:utf-8-*-import rename="duoceshi"p= re.compile(‘\bduoceshi\b‘)f = p.search(name)if f: print f.group()################

匹配 替換..追加..

bbs csdn 正則 flow code pan net eval nbsp 這裏都是以 圖片中的元素為例: 匹配出IMG標簽中alt的值: 1 Regex reg = new Regex(@"(?is)(?<=<img[^>]*)[^""]*(?

day11 grep匹配

collect lec linux 取反 pat 至少 判斷 con set ps aus | trep nginx # 查看所有正在運行的nginx任務 別名路徑: alias test_cmd=‘ls -l‘ PATH路徑: 臨時修改:

常用的匹配

marked clas 字符串 輸入 har round back [0 num 1.判斷只能輸入數字和字母 var num_char = /^[0-9A-Za-z]+$/;   ^ :代表匹配字符串開始位置;   [0-9A-Za-z]+ :[0-9A-Za-z]匹配數

js 對表單的一些驗證及匹配

攻擊 update 匹配規則 asc htm out gin lease public 利用的是jq的validate.js 詳見菜鳥教程http://www.runoob.com/jquery/jquery-plugin-validate.html 以下是我測試的幾個文件

匹配所有的a標簽

結束 strong 分組 正則匹配 ref val 所有 a標簽 解釋 <a\b[^>]+\bhref="([^"]*)"[^>]*>([\s\S]*?)</a> 分組1和分組2即為href和value 解釋: <a\b

關於JAVA匹配空白字符的問題(全角空格與半角空格)

轉義 空白 測試 rgs com text color 如何 clas 今天遇到一個字符串,怎麽匹配空格都不成功!!! 我把空格復制到test.properties文件 顯示“\u3000” ,這是什麽? 這是全角空格!!! 查了一下 \s

匹配<img>

普通 空白字符 展開 反向引用 功能 php php應用 換行 一個 preg_match_all(‘/<img(.*?)src=\"(.*?)\"(.*?)>/is‘, $content, $matches); matches[0] 整個img標簽 match

js匹配的出鏈接地址

鏈接地址 匹配 ase lower length ont 正則匹配 nbsp case content為需要匹配的值 var b=/<a([\s]+|[\s]+[^<>]+[\s]+)href=(\"([^<>"\‘]*)\"|\‘([^

awk結合匹配

需要 上海 所有 統計 技術 領域 panda -1 數據處理 利用awk分析data.csv中label列各取值的分布. 在終端執行head data.csv查看數據: 1 name,business,label,label_name 2 滄州光松房屋拆遷有限公

匹配方法

blank csdn 關於 expr 取ip地址 數值 換ip 表達式 java 這裏是幾個主要非英文語系字符範圍(google上找到的): 2E80~33FFh:中日韓符號區。收容康熙字典部首、中日韓輔助部首、註音符號、日本假名、韓文音符,中日韓的符號、標點、帶圈或帶括

修正匹配日期---基於網絡未知大神的

http 日期 bsp question ges 基於 就會 貢獻 工作 今天工作時需要用到日期格式檢驗,於是發現未知的大神貢獻的一套正則表達式【1】,看起來很復雜; 但是經過測試發現有些問題: ((\d{2}(([02468][048])|([13579][26]

java匹配

java 成功 println 字符 示例代碼 括號 lan string main java正則提取需要用到Matcher類,下面給出案例示例供參考需要提取車牌號中最後一個數字,比如說:蘇A7865提取5,蘇A876X提取6import java.util.regex.M

python3 匹配[^abc]和(?!abc)的區別(把多個字符作為一個整體匹配排除)

mat obj python str 效果 目的 str1 排除 blog 目的:把數字後面不為abc的字符串找出來 如1ab符合要求,2abc不符合要求 1 str = ‘1ab‘ 2 out = re.match(r‘\d+(?!abc)‘,str) 3 4

python匹配——中文字符的匹配

pri bsp odi col div class cnblogs mat 結果 # -*- coding:utf-8 -*- import re ‘‘‘python 3.5版本 正則匹配中文,固定形式:\u4E00-\u9FA5 ‘‘‘ words = ‘stud

php 匹配出a標簽級a標簽中的內容

har set ext htm file 鏈接地址 header char pre <?phpheader("Content-type: text/html; charset=utf-8"); $str=file_get_contents("https://www.