
[code]

    onetwothreefourfive
    onetwofour
    onethreefourfive
    onetwofive
    
[/code]

というテキストから文字列one、threeだけのある行を抽出して

[code]

    onetwothreefourfive
    onethreefourfive
    
[/code]

というテキストを作成したいのですがどうすればよいでしょうか。


CC BY-SA 4.0
2018-12-05T08:11:25.633
50927
2018-12-07T12:16:24.713
2018-12-05T13:31:01.187
19110
31192
question
python python3
テキストの同じ行に2つの文字列がある行だけを抽出


oneの後にthreeが出てくる語順ならば下記の正規表現で抽出可能です。

[code]

    import re
    s = """onetwothreefourfive
    onetwofour
    onethreefourfive
    onetwofive""" 
    s2 = '\n'.join(re.findall(r'^.*one.*three.*$', s, re.MULTILINE))
    print(s2)
    
[/code]


CC BY-SA 4.0
2018-12-05T08:28:37.243
50931
2018-12-05T08:28:37.243
9820
50927
answer


文字列を行単位で扱いたい時は、`splitlines()`を使って、行単位の文字列のリストにしてしまうのが便利です。

[code]

    s = """onetwothreefourfive
    onetwofour
    onethreefourfive
    onetwofive"""
    
[/code]

として、for文によるループ処理ならば、以下のようなコードでかけます。

[code]

    result = ''
    for line in s.splitlines(True):
        if 'one' in line and 'three' in line:
            result += line
    
[/code]

また、内包式を使うと次のように書けます。

[code]

    result = ''.join(x for x in s.splitlines(True) if 'one' in x and 'three' in x)
    
[/code]

なお、`splitlines(True)`とすると改行文字がついたままでリストになるので、改行文字の機種依存を考慮しなくても処理が可能です。


CC BY-SA 4.0
2018-12-07T12:16:24.713
51007
2018-12-07T12:16:24.713
15171
50927
answer