2012-01-09 7 views
18

2つの区切り文字の間の単語を削除それら2つの区切り記号の間に "<"と ">" ??

+0

は、常に1行に1つの形式のデータですか? – vdbuilder

+0

「何か」を抽出するか、「<" and ">」区切り記号の間のテキストを削除しますか? –

+0

こんにちは..データに複数の行がある...大きなファイルがあります 私は何かを抽出したいのですが、すっきりとしたスープを使っています。突然空のファイルが残ってしまいます。 "<" and ">"の間のテキストを消去すると、同じ目的も果たします。 – Fraz

答えて

34

使用regular expressions

ありがとう:

>>> import re 
>>> s = '<@ """@$ FSDF >something something <more noise>' 
>>> re.sub('<[^>]+>', '', s) 
'something something ' 

[更新]

あなたはドットが任意の文字を意味し、プラス記号が1つまたは複数を意味<.+>のようなパターンを、しようとした場合、それが動作しないことを知っている。

>>> re.sub(r'<.+>', s, '') 
'' 

なぜ!!!これは、正規表現がデフォルトで「貪欲」であるために発生します。式は>を含めて文字列の最後まで一致しますが、これは私たちが望むものではありません。 <と一致し、次の>で停止したいので、[^x]というパターンを使用して、「任意の文字以外のx」(xは>)というパターンを使用します。

?オペレータが「非貪欲」一致をオンにするので、これは、同じ効果を有する:

>>> re.sub(r'<.+?>', '', s) 
'something something ' 

以前はより明確であり、これは、より少ないタイピングです。 x?はxの0回または1回の発生を意味することに注意してください。

+0

:)は魅力のように動作します。ありがとう – Fraz

+4

正規表現の答えがすべて最初の場所で動作する理由を説明していれば、SOはもっと幸せな場所になります。 +1! – heltonbiker

10

もちろん、正規表現を使用することができます。

import re 
s = #your string here 
t = re.sub('<.*?>', '', s) 

上記のコードはそれを行う必要があります。

3
import re 
my_str = '<@ """@$ FSDF >something something <more noise>' 
re.sub('<.*?>', '', my_str) 
'something something ' 

re.sub機能は、通常のexpresionを取り、2番目のパラメータで文字列内のすべての一致を置き換えます。この場合、<>'<.*?>')の間のすべての文字を検索し、何も('')に置き換えます。

?は、貪欲でない検索ではreで使用されます。

詳細re moduleについて


する「ノイズ」は、実際のHTMLタグがある場合、私はあなただけの利益のためにBeautifulSoup

1

に見えるように勧め、あなたのようないくつかのコードを書くことができます:

with open('blah.txt','w') as f: 
    f.write("""<sdgsa>one<as<>asfd<asdf> 
<asdf>two<asjkdgai><iasj>three<fasdlojk>""") 

def filter_line(line): 
    count=0 
    ignore=False 
    result=[] 
    for c in line: 
     if c==">" and count==1: 
      count=0 
      ignore=False 
     if not ignore: 
      result.append(c) 
     if c=="<" and count==0: 
      ignore=True 
      count=1 
    return "".join(result) 

with open('blah.txt') as f: 
    print "".join(map(filter_line,f.readlines())) 

>>> 
<>one<>asfd<> 
<>two<><>three<> 
+0

ええ、私は彼らが2番目の ">" myname-> bob がある場合は、myname-> bobが得られますが、他の状況では 'bob'になるだけです。実際には、壊れたxmlを解析するのは理想的ではありません。 "<" ">"タグの間に改行文字があると、私のコードも失敗します。私のコードを読んでくれてありがとう –

3

最初にあなたに感謝しますPaulo Scardine、私はあなたのreを使って素晴らしいことをしました。このアイデアは、印刷目的のためにタグのないLibreOfficeのpoファイルを持つことでした。そして、私は、より小さくて簡単なもののためにヘルプファイルをきれいにする次のスクリプトを作った。

import re 
f = open('a.csv') 
text = f.read() 
f.close() 

clean = re.sub('<[^>]+>', ' ', text) 

f = open('b.csv', 'w') 
f.write(clean) 
f.close() 
関連する問題

 関連する問題