2017-01-06 5 views
4

regexを使って文字列から非英数字を取り除く方法についてはいくつか質問があります。私がしたいのは、文字や1つのスペースではない最初の文字の後に文字を含むすべての文字を削除することです(これには数字と二重スペースが含まれます)。例えばPythonの文字列の文字ではない最初の文字の後にあるものはすべて削除してください

My string is #not very beautiful 

My string is 

又は

Are you 9 years old? 

なるべきは

Are you 
なるはずです

this is the last example 

は、私はこれを実現するにはどうすればよい

this is the last 

になる必要がありますか?

+0

あなたはtを意味しましたか?空白も省略しますか? – inbinder

+1

私は、文字または単一のスペースではない文字の後に続くものはすべて省略することを意味します。以前のものはまったく同じです。その文字の前に空白があり、その文字を削除する方法が分かっている場合、それは追加ボーナスです。 – user

+0

あなたはグループをキャプチャすることでこれを行うことができます... – deweyredman

答えて

1

は、ホワイトリストを作成し、そのホワイトリストの中で何かない見たときに停止します。[^A-Za-z ]|

import itertools 
import string 

def rstrip(s, whitelist=None): 
    if whitelist is None: 
     whitelist = set(string.ascii_letters + ' ') # set the whitelist to a default of all letters A-Z and a-z and a space 
    # split on double-whitespace and take the first split (this will work even if there's no double-whitespace in the string) 
    # use `itertools.takewhile` to include the characters that in the whitelist 
    # use `join` to join them inot one single string 

    return ''.join(itertools.takewhile(whitelist.__contains__, s.split(' ', 1)[0])) 
+0

複数の空白グループで停止する必要があることに注意してください。 – TigerhawkT3

+0

@ TigerhawkT3:ああ!私は答える前にそれを見なかった、ありがとう。一定! – inspectorG4dget

+0

@ inspectorG4dget私は渡している文字列を仮定し、関数は必要な文字列を返します。コードを理解するのに役立ついくつかのコメントを追加してもよろしいですか? – user

5

方法についてsplitをし、最初の要素を取りますか?後で可能空白を削除することができます

import re 
re.split("[^A-Za-z ]| ", "My string is #not very beautiful")[0].strip() 
# 'My string is' 

re.split("[^A-Za-z ]| ", "this is the last example")[0].strip() 
# 'this is the last' 

re.split("[^A-Za-z ]| ", "Are you 9 years old?")[0].strip() 
# 'Are you' 

[^A-Za-z ]|は、第一のパターンは、文字も空白でもない単一の文字で、二つのパターンが含まれています。第2のパターンは二重の空白である。これらの2つのパターンのうちの1つで分割すると、分割後の最初の要素が探しているものになります。

+0

だから、白いスペースが7つあれば、後ろに白いスペースが5つしかないのですが、後でそれらをきれいにすることはできますか? – user

+1

空白が7つある場合、最初の要素は探しているものだけになります。文字の直後に '\ s {2} 'の分割があり、末尾に空白がないからです。しかし、 '#'や '9 'の場合には末尾にスペースが入る可能性があります – Psidom

+0

この解決法は、空白ではなく空白文字のみを扱います。 – TigerhawkT3

0

必須発現

def truncate_nonalpha_space(s): 
    return s[:next((x for x, a in enumerate(s.split(" ")[0]) if not a.isalpha() and not a == " "), len(s))].rstrip() 

ステップ:

発現は " "

  • から.isalpha()方法により文字又は等しくない値のインデックスを取得するように形成されている
    1. " "で分割された左辺は、二重空白のインスタンスを破棄するために使用されます。 Nは、そうでなければ、すべてのs[:len(s)]の、この残りの部分は

    2. これらの値の最初のSをスライスするために使用される(現在自体リストである)文字列のリストのインデックスを取得するために列挙されている

    3. をポップされ私は同様にあなたの他の例でそれをテストし、正しい結果を与えるように見えた

  • +0

    他の回答と同じです。空白を考慮に入れるだけでスペース文字を取ります。 – TigerhawkT3

    +1

    これは、「文字または単一のスペースではない」という質問として意図されています。 – ti7

    1
    import re 
    str1 = "this is the last example" 
    regex = re.compile(r"(([a-zA-Z]|(\s[a-zA-Z]))+)") 
    capture = re.match(regex, str1) 
    res = capture.group(1) 
    

    .rstrip()右の空白が取り除か返されます。これは末尾の空白を保持していないことに注意してください。これはあなたの例が示しているものですが、それはあなたが望むものではありません。

    +0

    これは空白文字だけでなく、どの空白文字でも機能します。 – TigerhawkT3

    +0

    @ TigerhawkT3はい、これは通常、人々が望むものなので設計によるものです。スペース文字で作業したいのであれば、 '\ s'を' 'に置き換えます。 –

    0
    ^.+?(?=[^A-Za-z ]|$|\s{2}) 
    

    これを使用して出力を取得することができます。re.findallを使用して出力を取得します。

    デモをご覧ください。

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

    +0

    他の答えと同じです。空白を考慮に入れるだけでスペース文字を取ります。 – TigerhawkT3

    +2

    @ TigerhawkT3のコメントを説明してください? – vks

    -1

    ハックが、収量使用しています:

    import string 
    
    li_test = [ 
        ("My string is #not very beautiful","My string is"), 
        ("Are you 9 years old?","Are you "), 
        ("this is the last example","this is the last "), 
    ] 
    
    tolerated = string.ascii_letters 
    
    def rstrip_(s_in): 
        last = None 
        for char in s_in: 
         if char in tolerated: 
          last = char 
          yield char 
         elif char == ' ': 
          if last == ' ': 
           raise StopIteration() 
          last = char 
          yield char 
         else:      
          raise StopIteration() 
    
    for input_, exp in li_test: 
        got = "".join(rstrip_(input_)) 
        msg = ":%s:<>:%s:" % (exp, got) 
        print (":%s:=>:%s:" % (input_, got)) 
        #cheating a bit because I dunno if the last space is wanted. 
        assert exp.rstrip() == got.rstrip(), msg 
    

    出力:

    :My string is #not very beautiful:=>:My string is : 
    :Are you 9 years old?:=>:Are you : 
    :this is the last example:=>:this is the last : 
    

    そして、はい、私は第二の機能で全体を包んで参加している必要がありますがそこの文字...

    +0

    他の回答と同じです。空白を考慮に入れるだけでスペース文字を取ります。 – TigerhawkT3

    +1

    あなたがコメントした他の人と同じですが、私はあなたが言っていることを得られません8 /(OPの質問、 "単一のスペース"は、再読み込みでは、いずれにしても、\ tなどの一般的な空白除去が必要な場合は、 'char == '' 'を'空白の中のchar'に変更すれば十分でしょう。 –

    関連する問題