我有一个包含的文本
text = """Dave 2008-09-20 2020-05-31 dave@google.com
Steve 2009-01-23 2020-04-30 steve@gmail.com
Rob 2007-02-14 2020-04-30 rob@gmail.com
Ryan 2010-02-11 2020-03-10 ryan@yahoo.com
"""
我需要将其更改为两种形式:第一:
['Dave 2008-09-20 2020-05-31 dave@google.com',
'Steve 2009-01-23 2020-04-30 steve@gmail.com',
'Rob 2007-02-14 2020-04-30 rob@gmail.com',
'Ryan 2010-02-11 2020-03-10 ryan@yahoo.com']
第二:
[('Dave', '2008-09-20', '2020-05-31', 'dave@google.com'),
('Steve', '2009-01-23', '2020-04-30', 'steve@gmail.com'),
('Rob', '2007-02-14', '2020-04-30', 'rob@gmail.com'),
('Ryan', '2010-02-11', '2020-03-10', 'ryan@yahoo.com')]
我得到了所有的结果:-但这肯定不是纯正则表达式的使用。。
首先:我使用
splB = re.split(r'n+',text.strip())
splB
test = [x for x in splB]
test
第二次使用:
splC = [(tuple)(re.split(' ',x.strip())) for x in re.split(r'n',text.strip())]
splC
两者都得到相同的结果,但我想使用regex作为我的手段。。如果可能的话,我不想使用list.split((之类的东西,只想使用regex和regex。。
第一种形式的纯正则表达式:
re.findall(r"[A-Za-z]+s(?:[0-9]{4}-[0-9]{2}-[0-9]{2}s){2}w+@w+.[a-z]+", text)
结果:
['Dave 2008-09-20 2020-05-31 dave@google.com',
'Steve 2009-01-23 2020-04-30 steve@gmail.com',
'Rob 2007-02-14 2020-04-30 rob@gmail.com',
'Ryan 2010-02-11 2020-03-10 ryan@yahoo.com']
解释:
[A-Za-z]+
:匹配名称,例如,";Dave">s
:匹配名称和第一个日期之间的空格(?:[0-9]{4}-[0-9]{2}-[0-9]{2}s){2}
:与两个日期({2}
(完全匹配的非捕获组,格式为YYYY-MM-DD,后跟空格w+@w+.[a-z]+
:匹配电子邮件
对于第二种形式,您可以执行以下操作:
regex = r"[A-Za-z]+s(?:[0-9]{4}-[0-9]{2}-[0-9]{2}s){2}w+@w+.[a-z]+"
[tuple(re.split(r"s", row)) for row in re.findall(regex, text)]
但是仅仅使用函数str.split
:肯定会更简单
[tuple(row.split(' ')) for row in re.findall(regex, text)]
在这两种情况下,结果都是:
[('Dave', '2008-09-20', '2020-05-31', 'dave@google.com'),
('Steve', '2009-01-23', '2020-04-30', 'steve@gmail.com'),
('Rob', '2007-02-14', '2020-04-30', 'rob@gmail.com'),
('Ryan', '2010-02-11', '2020-03-10', 'ryan@yahoo.com')]
请记住,除非这只是为了练习,否则这里不需要使用regex
。CCD_ 8在这种情况下将更加直接。如果这只是为了练习regex
,这将对你有效:
splt = [s.strip() for s in re.split(r"n(?=w)", text)] # your "first form"
formatted = [] # your "second form"
for s in splt:
formatted.append(tuple(re.split(r"s", s)))
如果你正在寻找一个班轮,这是完全可能的:
x = [tuple(re.split(r"s", s.strip())) for s in re.split(r"n(?=w)", text)]
[
('Dave', '2008-09-20', '2020-05-31', 'dave@google.com'),
('Steve', '2009-01-23', '2020-04-30', 'steve@gmail.com'),
('Rob', '2007-02-14', '2020-04-30', 'rob@gmail.com'),
('Ryan', '2010-02-11', '2020-03-10', 'ryan@yahoo.com')
]
Regex解释
第一个很简单:r"s"
只是在每个空白处进行拆分。这相当于str.split(" ")
。
第二个表达式r"n(?=w)"
使用正向前瞻来匹配仅且后面跟有a-zA-Z0-9_
集中的字符的n
。