2017-04-09 17 views
0

私は電話番号を含むファイルを持っており、そこからcsvファイルを作成したいと考えています。regex - 検索して置換し、CSV形式に変換する

私が直面している問題は、フォーマットが固​​定ではなく、解析が容易でないことです。

  • 各行には電話記録が1,2または3つ含まれています。
  • 電話機が(+ xxx)で始まり、2番目の電話機が '&'の前にある可能性があります。

私は3つのグループ内の各列を分割して、/期待される形式にはなく、成功せずに置き換える見つけることができる建て正規表現にしようとしていました。

誰でも正規表現で、行ごとにグループを識別できる可能性がありますか?

入力

(+999) 11 762 52 61 (+999) 11 762 41 11 
(+999) 44 695 01 76 & 44 695 01 89 
(+999) 21 510 02 14 (+999) 21 511 97 98 
(+999) 01 05 00 18 67 
(+999) 21 552 42 12 
(+999) 21 557 86 60 (+999) 21 557 86 72 
(+999) 11 873 93 13 & 11 825 59 92 
(+999) 15 307 57 15 & 15 307 57 16 & (+999) 11 974 19 57 
(+999) 21 551 91 51 (+999) 21 551 91 68 
(+999) 21 551 71 71 & 21 551 72 32 
(+999) 21 527 30 00 (+999) 21 551 54 89 
(+999) 11 621 15 00 (+999) 11 626 20 75 
(+999) 21 555 21 60 (+999) 21 555 21 71 (+999) 12 804 76 30 
(+999) 11 234 18 96 (+999) 11 234 54 48 
(+999) 11 828 35 37 (+999) 11 828 63 76 (+999) 41 363 27 23 
(+999) 11 690 03 00 (+999) 11 315 65 38 
(+999) 08 32 60 34 65 
(+999) 08 32 60 34 65 & (+999) 11 784 46 70 & (+999) 11 784 61 79 

期待される結果:

(+999) 11 762 52 61, (+999) 11 762 41 11, 
(+999) 44 695 01 76, 44 695 01 89, 
(+999) 21 510 02 14, (+999) 21 511 97 98, 
(+999) 01 05 00 18 67,, 
(+999) 21 552 42 12,, 
(+999) 21 557 86 60, (+999) 21 557 86 72, 
(+999) 11 873 93 13, 11 825 59 92, 
(+999) 15 307 57 15, 15 307 57 16, (+999) 11 974 19 57 
(+999) 21 551 91 51, (+999) 21 551 91 68, 
(+999) 21 551 71 71, 21 551 72 32, 
(+999) 21 527 30 00, (+999) 21 551 54 89, 
(+999) 11 621 15 00, (+999) 11 626 20 75, 
(+999) 21 555 21 60, (+999) 21 555 21 71, (+999) 12 804 76 30 
(+999) 11 234 18 96, (+999) 11 234 54 48, 
(+999) 11 828 35 37, (+999) 11 828 63 76, (+999) 41 363 27 23 
(+999) 11 690 03 00, (+999) 11 315 65 38, 
(+999) 08 32 60 34 65,, 
(+999) 08 32 60 34 65, (+999) 11 784 46 70, (+999) 11 784 61 79 
+0

によって生成されたPythonコード - >なぜあなたは、行の数字の量をカウントしませんか? – Dieter

+0

Split/explodeで '(&\(| [&(] +)'と書かれていますか? – chris85

答えて

1
import math 

for l in file: 

    nr_of_prefixes = l.count('(+') # amount of prefixes (+xxx) 
    prefixes = nr_of_prefixes * 3 # count the characters of a prefix 
    numbers = sum(c.isdigit() for c in l) # amount of numbers in a string 
    numbers -= prefixes # remove the prefixes 
    telephone_numbers = math.floor(numbers/8) # number of digits 


    l = l.replace(' (+',', (+') # add a , to (+ 
    l = l.replace(' &',',')  # replace a & by a comma 
    l = l.replace(',,',',')  # replace double ,, by a single , 

    # if there where only 2 phone numbers, add an ending comma 
    if telephone_numbers < 3: 
     l += "," 

    # if there was only 1 phone numbers, add an extra comma 
    if telephone_numbers < 2: 
     l += "," 

    # print, or add to a list 
    print(l) 
+0

ありがとう、 –

0

次の正規表現を使用します。ここでは((\(\+999\)[\d ]+)|& ([\d ]+))

は、ファイルの内容のサンプルです:

https://regex101.com/r/Q8grqd/1

そして、あなたのpythonを使用している場合regex101コードジェネレータ

import re 

regex = r"((\(\+999\)[\d ]+)|& ([\d ]+))" 

test_str = ("(+999) 11 762 52 61 (+999) 11 762 41 11\n" 
    "(+999) 44 695 01 76 & 44 695 01 89\n" 
    "(+999) 21 510 02 14 (+999) 21 511 97 98\n" 
    "(+999) 01 05 00 18 67\n" 
    "(+999) 21 552 42 12\n" 
    "(+999) 21 557 86 60 (+999) 21 557 86 72\n" 
    "(+999) 11 873 93 13 & 11 825 59 92\n" 
    "(+999) 15 307 57 15 & 15 307 57 16 & (+999) 11 974 19 57\n" 
    "(+999) 21 551 91 51 (+999) 21 551 91 68\n" 
    "(+999) 21 551 71 71 & 21 551 72 32\n" 
    "(+999) 21 527 30 00 (+999) 21 551 54 89\n" 
    "(+999) 11 621 15 00 (+999) 11 626 20 75\n" 
    "(+999) 21 555 21 60 (+999) 21 555 21 71 (+999) 12 804 76 30\n" 
    "(+999) 11 234 18 96 (+999) 11 234 54 48\n" 
    "(+999) 11 828 35 37 (+999) 11 828 63 76 (+999) 41 363 27 23\n" 
    "(+999) 11 690 03 00 (+999) 11 315 65 38\n" 
    "(+999) 08 32 60 34 65\n" 
    "(+999) 08 32 60 34 65 & (+999) 11 784 46 70 & (+999) 11 784 61 79") 

matches = re.finditer(regex, test_str, re.MULTILINE) 

for matchNum, match in enumerate(matches): 
    matchNum = matchNum + 1 

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group())) 

    for groupNum in range(0, len(match.groups())): 
     groupNum = groupNum + 1 

     print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum))) 
+0

これはすでに何かですが本当に正しいものではありません。とにかくありがとう:) –

+1

私は、行ごとに電話番号を抽出するための正規表現を提供した、それはあなたが望んでいないか、私は正規表現を知って申し訳ありません、Pythonではなく、コードは正規表現101から生成され、 ) –

+0

regexは、notepad ++、pycharmなどのエディタを使ってfind/replace(正規表現として)と3 grpups(\ 1、\ 2、\ 3)すべてのケースで動作しない –

関連する問題