2016-12-05 39 views
0

我寫一個Python腳本在這樣的字符串找到標記名稱:蟒蛇RE在模式空白

string='Tag Name =LIC100 State =TRUE'

如果使用這樣的

re.search('Name(.*)State',string)

一個表達式

我得到「= LIC100」。我只想得到LIC100。

有關如何設置模式以消除空白和相等信號的任何建議?

回答

0

按照上面的提示,我設法找到一個好的解決方案 其實,我想處理的字符串有一些不可打印的字符。正是這樣的

"Tag Name\x00=LIC100\x00\tState=TRUE" 

用前瞻的理念和回顧後,我發現了以下解決方案:

import re 
s = 'Tag Name\x00=LIC100\x00\tState=TRUE' 
T=re.search(r'(?<=Name\x00=)(.*)(?=\x00\tState)',s) 
print(T.group(0)) 

關於這樣做的好處是,結果不會對任何非打印字符。

<_sre.SRE_Match object; span=(10, 16), match='LIC100'> 
1

這是因爲你從Name到最後的State得到0+字符以外的換行符。您可能會限制在第1組的模式,只是非空格:

import re 
string='Tag Name =LIC100 State =TRUE' 
m = re.search(r'Name\s*=(\S*)',string) 
if m: 
    print(m.group(1)) 

Python demo

圖案的詳細資料

  • Name - 一個文字字符序列
  • \s* - 0+空格
  • = - 一個文字=
  • (\S*) - 組1捕獲0+字符而不是空格(或\S+可用於匹配除空格以外的1個或多個字符)。
0

最簡單的解決方案很可能只是剝離出來之後,其實像這樣:

s = " =LIC100 " 
s = s.strip('= ') 
print(s) 
#LIC100 

如果你堅持在正則表達式中這樣做,你可以嘗試這樣的:

reg = r'Name[ =]+([A-Za-z0-9]+)\s+State' 
0

您當前的正則表達式失敗,因爲(.*)捕獲所有字符,直到出現State。您可以使用積極的倒車後臺來描述優先於,但未包含在您實際想要捕獲的內容中,而不是捕獲所有內容。在這種情況下,「NAME =」 preceeds比賽,所以我們可以把它貼在向後斷言爲(?<=Name =),然後進行捕捉一切,直到下一個空白:

>>> import re 
>>> s = 'Tag Name =LIC100 State =TRUE' 
>>> r = re.compile("(?<=Name =)\w*") 
>>> print(r.search(s)) 
<_sre.SRE_Match object; span=(10, 16), match='LIC100'> 
>>> print(r.search(s).group(0)) 
LIC100 
+0

謝謝skrrgwasme。這對我很有幫助。 – Dariva

+0

我意識到我正在處理的字符串有一些不可打印的字符。該字符串類似於'Tag Name \ x00 = LIC100 \ x00 \ tState = TRUE'。我嘗試使用「T = re.search(r'(?<= Name \ x00 =)\ x00 *',s)」,但它返回<_sre.SRE_Match對象; span =(10,10),match =''> – Dariva