提问人:sushi 提问时间:6/25/2019 更新时间:6/25/2019 访问量:864
Python 正则表达式将 100 <数字替换为“100 BLOCK”,否则将最后两位数字替换为“00 BLOCK”
Python regex replace numbers < 100 with '100 BLOCK', else replace last two digits with '00 BLOCK'
问:
我正在使用 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
是否有可能以某种方式在一个正则表达式中执行此操作?
答:
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 内容及其附加内容。100
00
评论
0赞
sushi
6/26/2019
Stribizew谢谢!我添加了“BLOCK”,效果很好。只是好奇,我对 lambda 函数有点熟悉,我想知道“x”的值在哪里传递给 lambda 函数?
0赞
Wiktor Stribiżew
6/26/2019
@siushi 查看lambda x: ...
上一个:在比较两个表后创建标志列
评论