带有破折号的数字模式的Python正则表达式

时间:2018-10-30 17:21:49

标签: python regex string

我在熊猫数据框中有一列称为sample_id。每个条目都包含一个字符串,我想从该字符串中提取一个具有两种形式之一的数字模式

1-234-5-6789

123-4-5648

我很难为此定义正确的正则表达式模式。到目前为止,我一直在尝试以下方法:

re.findall(pattern=r'\b2\w+', string=str(data['sample_id']))

但这仅提取以2开头的值,并且仅提取数字模式的第一块。如何用破折号表示上述模式?

3 个答案:

答案 0 :(得分:1)

垂直管道|在正则表达式中进行“或”运算,因此您可以使用:

test1='123-4-5648'
test2='1-234-5-6789'

re.findall(pattern=r'[0-9]-[0-9]{3}-[0-9]-[0-9]{4}|[0-9]{3}-[0-9]-[0-9]{4}', string=test1)
re.findall(pattern=r'[0-9]-[0-9]{3}-[0-9]-[0-9]{4}|[0-9]{3}-[0-9]-[0-9]{4}', string=test2)

[0-9]09(包括)范围内的单个数字匹配,{4}表示应连续出现四个这样的数字,{{1} }表示连字符,而-表示OR,并将您提到的两种模式分开。

答案 1 :(得分:1)

您可以匹配一个可选部分|来匹配一个数字和一个连字符,然后匹配(?:\d-)?来匹配两个示例的数字模式。

\d{3}-\d-\d{4}

Regex demo

如果不使用单词边界(?:\d-)?\d{3}-\d-\d{4},则在值前不能有非空格字符,可以在正则表达式前加上\b,如果后面不能有非空格字符您可以在末尾添加(?<!\S)

答案 2 :(得分:0)

如果两个数字之间最多只能有一个连字符,那么^[0-9]+(-[0-9]+)+$会很好用。它使用normal*(special normal*)*模式,其中normal[0-9],而special-