Python:正则表达式输出 12_34 - 我需要 1234



所以我有如下输入: 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"并返回: ("数字", 1234), ("加号"、"+"), ("字符串", "Iamastring#"), ("标识", "I_am_an_Ident")我不想经历所有这些,因为我已经按照规定工作了,除了数字。解决方案代码如下所示: 标记 = ("加号"、"减号"、"倍"、"除法", "标识"、"字符串"、"数字") t_PLUS = "+" t_MINUS = '-'依此类推,直至: t_NUMBER = ###code 转到此处我不确定如何将多行流程放入t_NUMBER

我不确定你的意思以及为什么需要正则表达式,但也许这会有所帮助

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')的意义,等等。

a='12_34 5_6_8_2 4___3 1234'
>>> a.replace('_','').replace(' ',', ')
'1234, 5682, 43, 1234'
>>> 

你问题的措辞有点不清楚。如果您不关心输入验证,则以下内容应该有效:

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

如果您需要实际删除所有不是数字或空格的字符并在数字之间添加逗号,那么:

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

。应该完成任务。当然,编写一个只需要遍历一次字符串的函数可能比使用多个re.sub()调用更有效。

你似乎在做这样的事情:

>>> 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']

问题是pattern.replace不是re从比赛中删除_的信号,它会将您的正则表达式更改为'[0-9]+[0-9]*' .您要做的是对结果而不是模式replace - 例如,

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

另请注意,您的正则表达式可以稍微简化;我将省略如何的细节,因为这是家庭作业。

好吧,如果你真的必须使用re并且只有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)

但这集中体现了矫枉过正的概念。

最新更新