簡體   English   中英

需要在Python的正則表達式中使用特殊字符后逃脫字符?

[英]Need to Escape the Character After Special Characters in Python's regex?

我有以下python代碼:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import re
line = 'div><div class="fieldRow jr_name"><div class="fieldLabel">name<'
regex0 = re.compile('(.+?)\v class="fieldLabel">name.+?', re.VERBOSE | re.UNICODE)
regex1 = re.compile('(.+?)v class="fieldLabel">name.+?', re.VERBOSE | re.UNICODE)
regex2 = re.compile('(.+?) class="fieldLabel">name.+?', re.VERBOSE | re.UNICODE)

m0 = regex0.match(line)
m1 = regex1.match(line)
m2 = regex2.match(line)

if m0:
    print 'regex0 is good'
else:
    print 'regex0 is no good'

if m1:
    print 'regex1 is good'
else:
    print 'regex1 is no good'

if m2:
    print 'regex2 is good'
else:
    print 'regex2 is no good'

輸出是

regex0 is good
regex1 is no good
regex2 is good

我不太明白為什么我需要在regex0中的“(。+?)”之后轉義字符'v'。 如果我沒有逃脫,這將成為regex1,那么匹配將失敗。 但是,對於regex3中“(。+?)”之后的空格,我不必逃避。

任何想法?

提前致謝。

因此,您的方法存在一些問題導致您的具體投訴的問題包括:

  • 您沒有將te regexp字符串標記為raw( r'前綴) - 這使得Python編譯器在它們甚至到達re.match調用之前更改了字符串中的一些“\\”前綴字符。
  • “\\ v”碰巧是一個這樣的字符 - 一個垂直標簽,被“\\ 0x0b”取代
  • 你使用“re.VERBOSE”標志 - 它只是告訴regexp引擎忽略任何whitesapce字符。 作為垂直制表符的“\\ v”是此類中的一個字符,將被忽略。

所以,你有匹配regex0:字母“v”os似乎從來沒有這樣。

現在,對於您可能的修復方法,按照您應該嘗試執行的順序:

1)不要使用正則表達式來解析HTML。 真。 有很多軟件包可以很好地解析HTML,缺少那些可以使用stdlib自己的HTMLParserhtml.parser中的html.parser);

2)如果可能的話,使用Python 3而不是Python 2 - 如果繼續將Python2字符串視為“真實生活”文本的天真方法,那么您將被咬到HTML體內的第一個非ASCII字符。 Python 3自動編碼處理(當它不是自動時允許顯式設置)。

因為你可能沒有改變,所以嘗試使用regex.findall而不是regex.match - 這會返回一個匹配字符串的列表,並且可以檢索你正在查看的屬性,而無需從文件的開始搜索,或者依賴於在HTML中的換行符。

Python regex \\ v中有一個特殊的符號,你可以在這里閱讀: https//docs.python.org/2/library/re.html

Python正則表達式通常用r'your regex'塊編寫,其中“r”表示原始字符串。 https://docs.python.org/3/reference/lexical_analysis.html

在您的代碼中,所有特殊字符都應該被轉義為普通字符。 例如,如果你寫s - 這是空格,\\ s只是“s”。 為了使它以相反的方式工作,使用原始字符串。 我相信下面這一行是您需要的解決方案。

regex1 = re.compile(r'(.+?)v class="fieldLabel">name.+?', re.VERBOSE | re.UNICODE)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM