在Python中使用纯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 
"""

我需要将其更改为两种形式:第一:

['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

最新更新