

## やりたいこと

out.csv内の各URLの二番目のハイフン以降の文字を削除したい。

## 困っていること

下記のエラーがでてしまう。どうやらタイプエラーだということはわかるが、  
どういう状況のエラーなのか、解決策が不明。

[code]

    TypeError: findall() missing 1 required positional argument: 'string'
    
[/code]

## python ファイル内

[code]

    import re
    import csv
    
    with open('out.csv', encoding='utf-8') as f:
        reader = csv.reader(f)
        URL = re.findall(r'^[^-]*-[^-]*')
        for URL in reader:
            print (f'{URL}')
    
[/code]

## out.csv

[code]

    https://www.abcde.com/-0w69e7e1w00-あいうえお
    https://www.abcde.com/-0w69e7e9w70-かきくけこ
    https://www.abcde.com/-0w08e1e0w00-さしすせそ
    https://www.abcde.com/-0w69e7e1w70-たちつてと
    https://www.abcde.com/-0w69e6e2w54-なにぬねの
    
[/code]


CC BY-SA 4.0
2019-11-17T14:22:22.557
60610
2019-11-18T00:26:20.377
32946
question
python3 正規表現 csv
正規表現でcsvファイル内の文字列とマッチさせたい


`re.findall`は以下の様なメソッドなので、処理対象文字列を2つ目のパラメータに指定する必要があります。エラーは、その2つ目のパラメータが指定されていないために発生しているのでしょう。

[re.findall(pattern, string,
flags=0)](https://docs.python.org/ja/3/library/re.html#re.findall)

しかも質問のソースでは、その結果を使うことなく`csv`のデータを代入していますので、`re.findall`には意味がありません。

[code]

    URL = re.findall(r'^[^-]*-[^-]*')
    for URL in reader:
    
[/code]

おそらく、本当に使いたいのはこちらの`re.compile`ではないでしょうか？  
こちらならばパラメータが1つでも不思議ではありません。

[re.compile(pattern,
flags=0)](https://docs.python.org/ja/3/library/re.html#re.compile)

これを使う場合でも、`re.compile`の結果オブジェクトを格納する変数と、csvの1行を読み取る変数は変える必要があります。  
そして`for`ループの中でcompile結果オブジェクトを使って処理を行うことになります。

* * *

あるいは`re.findall`のまま使うなら、`csv`を`csv`としてではなく、テキストファイルとして読み込んで処理するか、`for`ループの中で`csv`の1行毎に処理するという風に変える必要があるでしょう。

* * *

ちなみにURLの正規表現とかは、こちらの記事が参考になると思われます。  
[Pythonの正規表現で特定のURLにマッチさせるには？](https://ja.stackoverflow.com/q/53818/26370)  
[python
正規表現でURLの一致チェック、抽出を行う](http://trelab.info/python/python-%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%81%A7url%E3%81%AE%E4%B8%80%E8%87%B4%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%80%81%E6%8A%BD%E5%87%BA%E3%82%92%E8%A1%8C%E3%81%86/)  
[urlの正規表現におけるドメインの取得(python)](https://qa.atmarkit.co.jp/q/9605)  
[Python regular expression again - match
url](https://stackoverflow.com/q/6718633/9014308)  
[gruber/Liberal Regex Pattern for Web
URLs](https://gist.github.com/gruber/8891611)  
[URLで使用可能な文字、使用できない文字](https://www.ipentec.com/document/web-url-invalid-char)  
[正規表現による URLの検出](https://www.ipentec.com/document/regularexpression-url-
detect)

* * *

取り敢えず元ソースに近く`csv`も使わない形で、ちょっと大雑把ですがこんな風になるでしょう。

[code]

    import re
    
    pattern = re.compile(r"(https?:\/\/[\w:%#$&\?\(\)~\.=\+\-]+\/-[^-,]*)-[^-,]*")
    
    with open('out.csv', encoding='utf-8') as f:
        for row in f.readlines():
            m = pattern.match(row)
            if m:
                print(m.group(1))
    
[/code]

結果はこうなります。

[code]

    https://www.abcde.com/-0w69e7e1w00
    https://www.abcde.com/-0w69e7e9w70
    https://www.abcde.com/-0w08e1e0w00
    https://www.abcde.com/-0w69e7e1w70
    https://www.abcde.com/-0w69e6e2w54
    
[/code]


CC BY-SA 4.0
2019-11-17T15:04:16.850
60611
2019-11-18T00:26:20.377
2019-11-18T00:26:20.377
26370
26370
60610
answer