使用Regex,如何从此序列代码中提取数字?

时间:2016-04-18 19:38:21

标签: regex regex-lookarounds regex-greedy boost-regex qregexp

我需要输入超过1,000个序列码才能进入数据库,但为了转换识别,它们必须是完全数字化的。它们看起来都与此格式类似,但包含不同的字符/数字:

d47a3c06-r188-4203-n838-fefd32082fd9

我一直在试图弄清楚如何使用正则表达式删除所有字母和破折号,但我现在不知所措。

我需要知道如何解决这个问题: d47a3c06-a188-4203-b838-fefd32082fc9

进入: 473061884203838320829

使用正则表达式。然后可能使用前5个数字将其修剪为5位数字。

非常感谢你!

3 个答案:

答案 0 :(得分:0)

根据您的编程语言,您可以轻松过滤数字并在之后加入 在Python模块和列表推导的帮助下,re中有一个示例:

import re

serials = ['d47a3c06-r188-4203-n838-fefd32082fd9', 'e48a3c08-r199-4203-n838-fefd32082fd0']
corrected_serials = []
for serial in serials:
    numbers = re.findall(r'\d+', serial)
    corrected_serials.append(''.join(numbers))

corrected_abbreviated = [item[0:5] for item in corrected_serials]

print corrected_serials
print corrected_abbreviated

# output
# ['473061884203838320829', '483081994203838320820']
# ['47306', '48308']

参见 a demo on ideone.com

答案 1 :(得分:0)

使用带s(搜索和替换)命令的第一个正则表达式,可以删除所有非数字s/[^0-9]//g

结果与第二个带有s命令的正则表达式一起使用,只打印第一个正数之前的数字"/^\(.\{5\}\).*$/\1/

将这些用于bash shell和sed命令。

如果序列号在serials.txt文件中:

cat serials.txt
d47a3c06-r188-4203-n838-fefd32082fd9

sed -e "s/[^0-9]//g" -e "s/^\(.\{5\}\).*$/\1/" serials.txt
47306

使用printf

printf d47a3c06-r188-4203-n838-fefd32082fd9 | sed -e "s/[^0-9]//g" -e "s/^\(.\{5\}\).*$/\1/"
47306

答案 2 :(得分:0)

由于您正在使用Drupal,如果您需要的是PHP中的答案,那么@ jay-jargot所做出的答案的PHP翻译就像这样:

$input = "d47a3c06-r188-4203-n838-fefd32082fd9";
$str = preg_replace("/[^0-9]/", "", $input);
$str = substr($str, 0, 5);
echo $str, "\n";        ## output: 47306