2012-04-22 107 views
4

我有一個正則表達式匹配字符串一樣:正則表達式在python十六進制字符串不工作

--D2CBA65440D

--77094A27E09

--77094A27E

- -770

--77094A27E09 -

基本上,它由一個或多個換行或空白包圍的十六進制字符串相匹配,並具有前綴 - 並且可能有也可能沒有 - 作爲後綴

我用下面的Python代碼,並它工作正常,大部分的時間:

hexaPattern = "\s--[0-9a-fA-F]+[--]?\s" 
hex = re.search(hexaPattern, part) 
if hex: 
    print "found a match" 

這適用於所有上述的,但它並沒有在此塊匹配--77094A27E09:

<div id="arrow2" class="headerLinksImg" style="display:block 

--77094A27E09 

;"> 

,但相同的字符串匹配中:

<input type="checkbox" name="checkbox" id="checkboxKG3" class 

--77094A27E09 

Content-T="checkboxKG" value="KG3" /> 

我在做什麼錯?

+0

嘗試修剪兩邊的html,直到找到導致問題的字符 – Shep 2012-04-22 17:48:19

+0

我得到該塊的匹配:http://rubular.com/r/wfqgEPHObB – 2012-04-22 17:48:37

+2

請注意'[ - ]?'將匹配一個或沒有破折號,*不*兩個破折號。我認爲你的意思是'( - )?' – Hamish 2012-04-22 17:50:55

回答

-1

我用下面的:

pattern = re.compile(r'(\n--)([0-9A-F]+)(--)?', re.I | re.S | re.M) 

它工作得很好。感謝您的全部貢獻。

+0

只是,僅供參考,如果它位於緩衝區的開始位置,它將不匹配該模式。如以色列提到的那樣使用'^'可以在任何一行的開頭找到它。 – 2016-12-07 21:12:37

2

試試這個: hexaPattern = r"^--[0-9a-fA-F]+(--)?\s"

我插入的修補程序是:在開始

R,使該反斜槓不會被「吃掉」的引號

^在開始的字符串的開始括號,而不是括號匹配

然後--(括號似乎是一個錯誤)

+0

你不想從一開始就匹配。 OP的十六進制值嵌入在一個更長的html字符串中。 – 2012-04-22 17:54:19

+0

好的。這些示例僅從一開始就顯示了模式 – 2012-04-22 17:56:26

8
import re 
hexaPattern = re.compile(r'\s--([0-9a-fA-F]+)(?:--)?\s') 
m = re.search(hexaPattern, part) 
if m: 
    print "found a match:", m.group(1) 

此預編譯速度模式。這使用r''(原始字符串),所以反斜槓肯定會正確傳遞。這增加了圓括號來建立「匹配組」,這樣你就可以在匹配後提取你的十六進制字符串;它還在第二個--字符串周圍添加了一個「不匹配組」。

因爲你在第二個「 - 」周圍使用了方括號,所以你得到了一個「字符類」。我不確定角色類[--]匹配的是什麼;我認爲它應該匹配任何'-'角色。在角色類中,' - '通常用於範圍,如[a-z],但範圍[--]沒有意義,因此我認爲它會回退到匹配'-'。問題是:因爲你後面有?,它只會匹配零個或一個'-'字符,而你需要它能夠匹配兩個。

+0

值得一提的是,如果您使用了許多不同的模式,則只需編譯該模式。根據[python re docs](https://docs.python.org/2/library/re.html#re.compile),這些值被緩存,所以如果你只使用了一些模式,編譯它們你沒有多大的意義。 – andersonvom 2014-11-06 11:53:36

0

其他人指出你的正則表達式的問題,即[--],它基本上以非常規的方式找到一個單一的連字符......無論如何,不​​是你想要的。

我也建議,在開始和正則表達式的末尾均具有\s也將導致在某些情況下的問題,因爲它匹配spacestabsnewlines。所以你最終可能會遇到你的文件有--77094A27E09\n--D2CBA65440D和第二個--D2CBA65440D不匹配的情況,因爲換行符在前一場比賽結束時被\s消耗。

另外,您似乎正逐個檢查文件中的每一行,您並不需要這樣做。您可以使用re.findall來一舉感到所有比賽。

最後--在字符串的開頭似乎是你的真實標記,而不是\s在開頭或結尾。那麼爲什麼不使用--([0-9a-fA-F]+)(?:--)?以十六進制數字爲基礎的組。 findall只返回你想要的組。然後,你可以做到這一點(讀取整個HTML文件分割成一個字符串,並檢查所有的結果):

text = """ 
<input type="checkbox" name="checkbox" id="checkboxKG3" class 
--D2CBA65440D 
<a> --77094A27E09-- </a> 
    hello world --77094A27E 
--770-- 
    --77094A27E09 
Content-T="checkboxKG" value="KG3" /> 
""" 
import re 
hexapattern = r'--([0-9a-fA-F]+)(?:--)?' 
print re.findall(hexapattern, text) 
>>> ['D2CBA65440D', '77094A27E09', '77094A27E', '770', '77094A27E09'] 

我認爲這是你想要的

相關問題