2017-04-18 19 views
1

私はPythonには新しく、正規表現に問題があります。リスト内の個々の単語に外部ファイルを解析するために使用しています。 "do not"や "x-ray"のようなハイフネーションのような収縮を正しく挿入できるようにする必要があります。特殊文字で分割する正規表現

実際には正常に動作しない2つの事柄があります:1)私のリストは最後の要素に空の文字列を挿入します。2)単一の引用符またはハイフン(前または後にスペースを区切る)で分割しようとすると、その隣に何があってもスペシャルキャラクターに。

「これに続いて」と括弧書きで文字を挿入できると思ったが、うまくいかないようだ。ここで

は私のコードスニペットです:

with open(badWords, 'r') as f: 
     line = f.read().strip() 
     ignoreList = split(r'[(\s\') (\'\s) (\s\-) (\-\s) \. \! \; \: \" \$ \% \& \, \+ \* \< \> \? \/ \[ \] \(\) \d]+', line) 

(および "X線" "ない" が追加された)ファイルの出力は次のようになります。

[ '四'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '、'命題 '、'それ '、'すべて '、'男性 '、'存在 '、'作成 '、'平等 '、' ']

私は間違っていますか?

+2

ファイルの正確な内容は何ですか?また、予想される出力は何ですか? – Vallentin

+0

期待される出力は ['Four'、 'score'、 'and'、 'do not'、 'x-ray'、 'seven'、 'years'、 'ago'、 'our'大陸 '、'新 '、'国家 '、'妊娠 '、'イン '、'リバティー '、'献身的な ' '、' '、' '、' '、' '、' '、' '' '' '' '' '' '' '' equal '] もしそれが明白でないなら、正規表現を使用する必要があります。 – LoserName

+1

はい、入力は何ですか?入力を知らずに出力を作成するのはちょっと難しいです。 – Vallentin

答えて

0

私は割り当ての他の要件に対応するために異なる方向に進み、結果を共有したいと考えていました。

もう1つの要件は、単語を辞書にロードしてオカレンスをカウントして、ループで再利用できるパターンを定義する必要があることです。私は少なくとも1つの文字に続いて、単一引用符(収縮の場合)またはハイフン(ハイフネーションされた単語の場合)の0または1と、少なくとも1つの文字のあとに続いています。

pattern = compile("[a-z]+[-']?[a-z]+", IGNORECASE) 
wordCount = {} 
with open('Words.txt', 'r') as f: 
    for word in f.read().split(): 
     match = search(pattern, word) 
     if match: 
      if match.group().lower() not in wordCount: 
       wordCount[match.group().lower()] = 1 
      else: 
       wordCount[match.group().lower()] += 1 

は、これらの結果を得るために、よりエレガントな方法があるかもしれませんが、これは動作するようです。

0

あなたが求めているのは、すべての単語を分割し、ハイフネーションまたはアポストロフィーの単語を正しく含む方法です。

は、この正規表現を試してみてください:[^ \ sの\!] +

は、必要に応じて無視する他の句読点を追加します。

例 - あなたはハイフンやアポストロフィの隣のスペースがある場合に何をしたいのかそれはあなたの質問から明らかではないregex101

0

テキストはあなたが["Is", "X-ray", "a", "hyper-", "or", "a", "hyponym", of "scanner", "darlin'"]する結果をする場合、我々は単に文字ではありません何の順序、ハイフンまたはアポストロフィに分割して、それは、簡単です"Is X-ray a hyper- or a hyponym of scanner, darlin'?

であると仮定します

split(r"[^a-zA-Z-']+", line) 

あなたが["Is", "X-ray", "a", "hyper", "or", "a", "hyponym", of "scanner", "darlin"]する結果を想像した場合、それはもう少し複雑になります:

ここ
split(r"\s+['-]\s*|['-]\s+|[^a-zA-Z-']+", line) 

我々は、Oを分割前に分割したものだけでなく、ハイフンやアポストロフィー(後にスペースが続くこともあります)、ハイフンやアポストロフィーの後ろに空白が続くスペースが続きますが、先頭にスペースはありません。前後にスペースがあるか、または両方にスペースがある)。

+0

2番目は、リストの最後の要素として空の文字列が追加されていますが、後になっています。地球から ""、 "から"、 "地球"、 "]"を返します。ありがとう! – LoserName

+0

文字列の先頭または最後にデリミタ(あなたの場合は ''。 "')がある場合は、 'split'を使用している場合は不可避です。空の文字列を削除することができます: ''単語ならば単語 ''なら単語!= ''] '。 – Amadan

+0

あなたの助けてくれてありがとう、アマダン! – LoserName

関連する問題