0

したがって、次のような入力があります。12_34 5_6_8_2 4_____3 1234

そして、そこから必要な出力は次のとおりです。1234, 5682, 43, 1234

r'[0-9]+[0-9_]*'.replace('_','')が知る限り、数字とアンダースコアの組み合わせではない入力を正常に拒否します。アンダースコアは最初の文字にすることはできません。

ただし、_ を空の文字列に置き換えると、12_34 が 12 と 34 として出力されます。

これを「置き換える」よりも良い方法はありますか? または、この問題に対処するために正規表現を適応させることはできますか?

編集:以下のコメントで質問に答えていましたが、ここで指定したほうがよいことに気付きました。したがって、大まかな目的は、長い入力文字列を取得することです (小さな例: "12_34 + 'Iamastring#' I_am_an_Ident" を返します: ('NUMBER', 1234), ('PLUS', '+'), ('STRING' , 'Iamastring#'), ('IDENT', 'I_am_an_Ident') 数値以外はすべて指定どおりに機能しているため、すべてを実行したくありませんでした。ソリューション コードは次のようになります。tokens = ('PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'IDENT', 'STRING', 'NUMBER') t_PLUS = "+" t_MINUS = '-' 等々: t_NUMBER = ## #ここにコードが入ります I'

4

5 に答える 5

2

あなたが何を意味しているのか、なぜ正規表現が必要なのかわかりませんが、これが役立つかもしれません

In [1]: ins = '12_34 5_6_8_2 4_____3 1234'

In [2]: for x in ins.split(): print x.replace('_', '')
1234
5682
43
1234

編集された質問に応じて編集:

そこでトークンを使って何をしているのかはまだよくわかりませんが、次のようなことをします(少なくとも私には理にかなっています:

input_str = "12_34 + 'Iamastring#' I_am_an_Ident" 
tokens = ('NUMBER', 'SIGN', 'STRING', 'IDENT')
data = dict(zip(tokens, input_str.split()))

これはあなたに与えるでしょう

{'IDENT': 'I_am_an_Ident',
 'NUMBER': '12_34',
 'SIGN': '+',
 'STRING': "'Iamastring#'"}

それからあなたはすることができます

data['NUMBER'] = int(data['NUMBER'].replace('_', ''))

そしてあなたが好きなもの。

tokens = ('PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'IDENT', 'STRING', 'NUMBER')PS 役に立たない場合は申し訳ありませんが、 などを使用する意味がわかりません。

于 2012-06-03T10:46:43.640 に答える
0

The phrasing of your question is a little bit unclear. If you don't care about input validation, the following should work:

input = '12_34 5_6_8_2 4_____3 1234'
re.sub('\s+', ', ', input.replace('_', ''))

If you need to actually strip out all characters which are not either digits or whitespace and add commas between the numbers, then:

re.sub('\s+', ', ', re.sub('[^\d\s]', '', input))

...should accomplish the task. Of course, it would probably be more efficient to write a function that only has to walk through the string once rather than using multiple re.sub() calls.

于 2012-06-03T10:59:57.460 に答える
0

あなたは次のようなことをしているようです:

>>> data = '12_34 5_6_8_2 4_____3 1234'
>>> pattern = '[0-9]+[0-9_]*'
>>> re.findall(pattern, data)
['12_34', '5_6_8_2', '4_____3', '1234']
re.findall(pattern.replace('_', ''), data)
['12', '34', '5', '6', '8', '2', '4', '3', '1234']

問題は、一致からsを削除するためpattern.replaceのシグナルではなく、正規表現を次のように変更することです。あなたがしたいのは、パターンではなく、結果に対して行うことです-例えば、re_'[0-9]+[0-9]*'replace

>>> [match.replace('_', '') for match in re.findall(pattern, data)]
['1234', '5682', '43', '1234']

また、正規表現はわずかに簡略化できることに注意してください。これは宿題なので、詳細は省略します。

于 2012-06-03T11:17:04.330 に答える
0

本当にreand onlyを使用する必要がある場合はre、次のようにすることができます。

import re

def replacement(match):
    separator_dict = {
        '_': '',
        ' ': ',',
    }
    for sep, repl in separator_dict.items():
        if all( (char == sep for char in match.group(2)) ):
            return match.group(1) + repl + match.group(3)

def rec_sub(s):
    """
    Recursive so it works with any number of numbers separated by underscores.
    """
    new_s = re.sub('(\d+)([_ ]+)(\d+)', replacement, s)
    if new_s == s:
        return new_s
    else:
        return rec_sub(new_s)

しかし、それはやり過ぎの概念を象徴しています。

于 2012-06-03T11:30:49.293 に答える
0
a='12_34 5_6_8_2 4___3 1234'
>>> a.replace('_','').replace(' ',', ')
'1234, 5682, 43, 1234'
>>> 
于 2012-06-03T10:48:54.170 に答える