Python 正则表达式将 100 <数字替换为“100 BLOCK”,否则将最后两位数字替换为“00 BLOCK”

Python regex replace numbers < 100 with '100 BLOCK', else replace last two digits with '00 BLOCK'

提问人:sushi 提问时间:6/25/2019 更新时间:6/25/2019 访问量:864

问:

我正在使用 Python 2.7.13 来清理一些数据。

我有一个数字列表,如果字符串以数字开头。如果起始数字小于 100,我需要将其替换为 .如果数字更大,我需要将最后两位数字替换为 .'100 BLOCK''00 BLOCK'

文本列表保证以数字 0 或更大开头。

'1234 foo foo' --> '1200 BLOCK FOO FOO'
'19 bar bar' --> '100 BLOCK bar bar'
'0 baz baz' --> '100 BLOCK baz baz'

目前,我在 for 循环中运行两个不同的正则表达式:

for row in listOfNumbers:
    /* Replace last two digits with '00 BLOCK' */
    firstRegex = re.sub(r'^(\d*)\d{2}\b', r'\g<1>00 BLOCK', row)

    /* Replace digits under 100 with '100 BLOCK'. This includes 0 */
    secondRegex = re.sub(r'^(\d{1,2})\b', '100 BLOCK', firstRegex)

    /* Do other stuff with results

是否有可能以某种方式在一个正则表达式中执行此操作?

正则表达式 python-2.7 列表

评论


答:

1赞 Wiktor Stribiżew 6/25/2019 #1

您可以使用

import re
strs = ['1234 foo foo', '19 bar bar', '0 baz baz']
rx = re.compile(r'^(?:(\d{1,2})|(\d+)\d{2})(?!\d)')
for s in strs:
    print(rx.sub(lambda x: '100' if x.group(1) else x.group(2)+"00", s))

输出:

1200 foo foo
100 bar bar
100 baz baz

查看 Python 演示

正则表达式匹配:

  • ^- 字符串的开头
  • (?:(\d{1,2})|(\d+)\d{2})- 匹配 2 个备选方案的非捕获组:
    • (\d{1,2})- 第 1 组:一位或两位数字 (<100)
    • |-或
    • (\d+)\d{2}- 第 2 组捕获一个或多个数字,然后捕获任意 2 个数字
  • (?!\d)- 不允许使用右边的数字。

如果使用 Group 1 matched 替换匹配项,否则将返回 Group 2 内容及其附加内容。10000

评论

0赞 sushi 6/26/2019
Stribizew谢谢!我添加了“BLOCK”,效果很好。只是好奇,我对 lambda 函数有点熟悉,我想知道“x”的值在哪里传递给 lambda 函数?
0赞 Wiktor Stribiżew 6/26/2019
@siushi 查看lambda x: ...