我在熊猫数据框中有一列称为sample_id。每个条目都包含一个字符串,我想从该字符串中提取一个具有两种形式之一的数字模式
1-234-5-6789
或
123-4-5648
我很难为此定义正确的正则表达式模式。到目前为止,我一直在尝试以下方法:
re.findall(pattern=r'\b2\w+', string=str(data['sample_id']))
但这仅提取以2开头的值,并且仅提取数字模式的第一块。如何用破折号表示上述模式?
答案 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]
与0
到9
(包括)范围内的单个数字匹配,{4}
表示应连续出现四个这样的数字,{{1} }表示连字符,而-
表示OR,并将您提到的两种模式分开。
答案 1 :(得分:1)
您可以匹配一个可选部分|
来匹配一个数字和一个连字符,然后匹配(?:\d-)?
来匹配两个示例的数字模式。
\d{3}-\d-\d{4}
如果不使用单词边界(?:\d-)?\d{3}-\d-\d{4}
,则在值前不能有非空格字符,可以在正则表达式前加上\b
,如果后面不能有非空格字符您可以在末尾添加(?<!\S)
。
答案 2 :(得分:0)
如果两个数字之间最多只能有一个连字符,那么^[0-9]+(-[0-9]+)+$
会很好用。它使用normal*(special normal*)*
模式,其中normal
是[0-9]
,而special
是-
。