2

ページソースからの次のコードスニペットがあります。

var myPDF = new PDFObject({
url: "http://www.site.com/doc55.pdf",
  id: "pdfObjectContainer",
  width: "100%",
  height: "700px",
  pdfOpenParams: {
    navpanes: 0,
    statusbar: 1,
    toolbar: 1,
    view: "FitH"
  }
}).embed("pdf_placeholder"); 

'PDFObject('

ページ内で一意です。REGEX を使用して URL コンテンツを取得したい。この場合、私は取得する必要があります

http://www.site.com/doc55.pdf

助けてください。

4

7 に答える 7

3

正規表現を使用せずに問題を解決するための代替手段は次のとおりです。

url,in_object = None, False
with open('input') as f:
    for line in f:
        in_object = in_object or 'PDFObject(' in line
        if in_object and 'url:' in line:
            url = line.split('"')[1]
            break
print url
于 2013-07-04T20:48:51.780 に答える
0

後読みアサーションと先読みアサーションの組み合わせを使用する

import re
re.search(r'(?<=url:).*?(?=",)', s).group().strip('" ')
'http://www.site.com/doc55.pdf'
于 2013-07-04T20:41:20.593 に答える
0

がページ内の一意の識別子である場合'PDFObject('、最初の次の引用されたコンテンツのみを照合する必要があります。

DOTALL フラグ(re.DOTALLまたはre.S) と貪欲でないスター ( )を使用すると、次の*?ように記述できます。

import re

snippet = '''                                    
var myPDF = new PDFObject({
url: "http://www.site.com/doc55.pdf",
  id: "pdfObjectContainer",
  width: "100%",
  height: "700px",
  pdfOpenParams: {
    navpanes: 0,
    statusbar: 1,
    toolbar: 1,
    view: "FitH"
  }
}).embed("pdf_placeholder");
'''

# First version using unnamed groups
RE_UNNAMED = re.compile(r'PDFObject\(.*?"(.*?)"', re.S)

# Second version using named groups
RE_NAMED = re.compile(r'PDFObject\(.*?"(?P<url>.*?)"', re.S)

RE_UNNAMED.search(snippet, re.S).group(1)
RE_NAMED.search(snippet, re.S).group('url')
# result for both: 'http://www.site.com/doc55.pdf'

一度使用されたために正規表現をコンパイルしたくない場合は、単に次の構文を使用します。

re.search(r'PDFObject\(.*?"(.*?)"', snippet, re.S).group(1)
re.search(r'PDFObject\(.*?"(?P<url>.*?)"', snippet, re.S).group('url')

4 つの選択肢のうち、ニーズと好みに合わせて選択してください。

于 2013-07-04T21:35:22.440 に答える
0

他の答えはうまくいくように見えるかもしれませんが、ほとんどの場合、ページ上の唯一の固有のものは 'PDFObject(' です。より良い正規表現は次のようになります:

PDFObject\({\surl: "(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)",

「PDFObject(」は一意であり、いくつかの基本的な URL 検証が含まれていることを考慮に入れています。

以下は、この正規表現を Python で使用する方法の例です。

>>> import re
>>> strs = """var myPDF = new PDFObject({
... url: "http://www.site.com/doc55.pdf",
...   id: "pdfObjectContainer",
...   width: "100%",
...   height: "700px",
...   pdfOpenParams: {
...     navpanes: 0,
...     statusbar: 1,
...     toolbar: 1,
...     view: "FitH"
...   }
... }).embed("pdf_placeholder");"""
>>> re.search(r'PDFObject\({\surl: "(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)",',strs).group(1)
'http://www.site.com/doc55.pdf'

純粋な python (正規表現なし) の代替は次のようになります。

>>> unique = 'PDFObject({\nurl: "'
>>> start = strs.find(unique) + len(unique)
>>> end = start + strs[start:].find('"')
>>> strs[start:end]
'http://www.site.com/doc55.pdf'

正規表現ワンライナーなし:

>>> (lambda u:(lambda s:(lambda e:strs[s:e])(s+strs[s:].find('"')))(strs.find(u)+len(u)))('PDFObject({\nurl: "')
'http://www.site.com/doc55.pdf'
于 2013-07-04T20:46:20.700 に答える
0

これは機能します:

import re

src='''\
var myPDF = new PDFObject({
url: "http://www.site.com/doc55.pdf",
URL: "http://www.site.com/doc52.PDF",
  id: "pdfObjectContainer",
  width: "100%",
  height: "700px",
  pdfOpenParams: {
    navpanes: 0,
    statusbar: 1,
    toolbar: 1,
    view: "FitH"
  }
}).embed("pdf_placeholder"); '''   

print [m.group(1).strip('"') for m in 
        re.finditer(r'^url:\s*(.*)[\W]$',
        re.search(r'PDFObject\(\{(.*)',src,re.M | re.S | re.I).group(1),re.M|re.I)]

プリント:

['http://www.site.com/doc55.pdf', 'http://www.site.com/doc52.PDF']
于 2013-07-04T20:48:17.410 に答える