给出一个列表(可以是numpy数组)的地址:
>input: ['F/O 1751 HOBART PL NW', '11TH ST NW 2301', '801 MT VERNON ST NW']
其中数字并不总是出现在字符串中的相同位置。有没有比首先使用正则表达式提取数字然后以某种方式将其插回以便将其舍入到最近(比如说)100更快的方法。
>output: ['F/O 1800 HOBART PL NW', '11TH ST NW 2300', '800 MT VERNON ST NW']
任何帮助将不胜感激。谢谢,
编辑:
只有字边界(空格,句号,逗号)分隔的数字才需要转换,因此r' \ b \ d + \ b'会工作的。
答案 0 :(得分:3)
您可以使用re.sub()
import re
def replace_number(n):
return str(int(round(int(n.group(0)), -2)))
data = ['F/O 1751 HOBART PL NW', '11TH ST NW 2301', '801 MT VERNON ST NW']
## I'm assuming you only want to munge numbers with 3 or more digits:
for datum in data:
print re.sub(r"(\d{3,})", replace_number, datum)
输出:
F/O 1800 HOBART PL NW
11TH ST NW 2300
800 MT VERNON ST NW
注意 - 如果字符串中有020这样的数字,这会给您带来不可取的结果:
'020 MT VERNON ST NW'
变为
'0 MT VERNON ST NW'
如果您希望在数据中找到,则需要在replace_number(n)
函数中添加一些检查
答案 1 :(得分:1)
这是我的解决方案。相当简单易懂 - 它循环遍历列表中的每个项目,逐个字符串地处理它。它会在该特定字符串中查找大于3位或更多的所有数字,然后将其替换为圆形版本。它最终打印出一切。
import re
l = ['F/O 1751 HOBART PL NW', '11TH ST NW 2301', '801 MT VERNON ST NW']
for i in l:
a = re.findall(r'(\d{3,})', i)
s = re.sub( str(a[0]), str(round(int(a[0]),-2)), i)
print(s)
这输出以下内容:
F/O 1800 HOBART PL NW
11TH ST NW 2300
800 MT VERNON ST NW