如何在 python 中使用正则表达式组仅获取一行的一部分?
How to get only a part of a line using regex group in python?
如何在 python 中使用正则表达式组只获取一行的一部分?
我有一个每行一个条目的数据库,我想根据行首的月份和日期数据将其拆分为文件,但我只想输出没有前 21 个字符的行。
这是数据库的快速示例:
01-01-1989-06:30:00| Stefan Reinartz; 1.1.1989; 06:30; +01; Engelskirchen,Germany; 50n59; 7e24; M;
01-01-1996-08:40:00| Dawid Kwiatkowski; 1.1.1996; 08:40; +01; Gorzów Wielkopolski,Poland; 52n44; 15e15; M;
01-01-2001-01:30:00| Liam Flockhart; 1.1.2001; 01:30; -08; San Diego,California; 32n43; 117w09; M;
01-02-1467-00:20:00| King of Poland Sigismund I the Old; 2.1.1467; 00:20; +00:21:33; Kozienice,Poland; 51n35; 21e33; M;
01-02-1746-09:00:00| Duke of Rambouillet Louis Marie; 2.1.1746; 09:00; -00:03:41; Madrid,Spain; 40n24; 3w41; M;
01-02-1784-01:00:00| Duke of Saxe-Coburg and Gotha Ernst I; 2.1.1784; 01:00; +00:10:58; Coburg,Germany; 50n15; 10e58; M;
所需的输出文件 01-01.zbs:
Stefan Reinartz; 1.1.1989; 06:30; +01; Engelskirchen,Germany; 50n59; 7e24; M;
Dawid Kwiatkowski; 1.1.1996; 08:40; +01; Gorzów Wielkopolski,Poland; 52n44; 15e15; M;
Liam Flockhart; 1.1.2001; 01:30; -08; San Diego,California; 32n43; 117w09; M;
输出文件 01-02.zbs:
King of Poland Sigismund I the Old; 2.1.1467; 00:20; +00:21:33; Kozienice,Poland; 51n35; 21e33; M;
Duke of Rambouillet Louis Marie; 2.1.1746; 09:00; -00:03:41; Madrid,Spain; 40n24; 3w41; M;
Duke of Saxe-Coburg and Gotha Ernst I; 2.1.1784; 01:00; +00:10:58; Coburg,Germany; 50n15; 10e58; M;
我在开头按一年中的每一天对它们进行排序,并相应地拆分文件。但我不想输出每行的前 21 个字符,所以我尝试使用正则表达式组来执行此操作,如下所示:
re.search("^[0-9]{2}-[0-9]{2}-[0-9]{4}-[0-9]{2}:[0-9]{2}:[0-9]{2}| (.*)",line[0])
re.search("^.{21}(.*)",line[0])
但是,如何使用组(.*) \1 只输出那部分?
甚至需要正则表达式来做到这一点吗?
这是完整的代码:我是 python 的初学者,所以代码可能有很大的错误:
import re
with open("database.txt") as f:
pstring='' #previous line string beginning
astring='' #actual line string beginning
try:
out = open(re.search("^[0-9]{2}-[0-9]{2}",line[0]) + ".zbs", "w")
for line in f:
astring = re.search("^[0-9]{2}-[0-9]{2}-",line[0])
if not pstring = astring:
out.write(line)
pstring = re.search("^[0-9]{2}-[0-9]{2}-",line[0])
if out: out.close()
out = open(re.search("^[0-9]{2}-[0-9]{2}",line[0]) + ".zbs", "w")
else:
pstring = re.search("^[0-9]{2}-[0-9]{2}-",line[0])
out.write(line)
finally:
out.close()
此致。
让我们考虑文件中的一行:
line = "01-01-1989-06:30:00| Stefan Reinartz; 1.1.1989; 06:30; +01; Engelskirchen,Germany; 50n59; 7e24; M;"
如果你想去除一行的前 21 个字符,那么你可以简单地使用所谓的切片,如下所示:
>>> print(line[21:])
Stefan Reinartz; 1.1.1989; 06:30; +01; Engelskirchen,Germany; 50n59; 7e24; M;
(查看 this 站点以了解有关通过切片检索子字符串的更多详细信息。)
现在,如果您需要提取这样一行的部分内容,那么您确实可以使用正则表达式。如您所述,要获取日期的各个部分,您可以使用例如具有如下命名组的模式:
import re
p = r"[^\;]+; (?P<day>[0-9]+)\.(?P<month>[0-9]+)\.(?P<year>[0-9]+)"
m = re.match(p, line)
然后可以像这样访问匹配的组:
>>> m.group("day")
'1'
>>> m.group("month")
'1'
>>> m.group("year")
'1989'
(当然,您可以通过直接从一行的开头提取日期来更轻松地获取日期,但这只是一个演示命名组用法的示例。)
如何在 python 中使用正则表达式组只获取一行的一部分? 我有一个每行一个条目的数据库,我想根据行首的月份和日期数据将其拆分为文件,但我只想输出没有前 21 个字符的行。 这是数据库的快速示例:
01-01-1989-06:30:00| Stefan Reinartz; 1.1.1989; 06:30; +01; Engelskirchen,Germany; 50n59; 7e24; M;
01-01-1996-08:40:00| Dawid Kwiatkowski; 1.1.1996; 08:40; +01; Gorzów Wielkopolski,Poland; 52n44; 15e15; M;
01-01-2001-01:30:00| Liam Flockhart; 1.1.2001; 01:30; -08; San Diego,California; 32n43; 117w09; M;
01-02-1467-00:20:00| King of Poland Sigismund I the Old; 2.1.1467; 00:20; +00:21:33; Kozienice,Poland; 51n35; 21e33; M;
01-02-1746-09:00:00| Duke of Rambouillet Louis Marie; 2.1.1746; 09:00; -00:03:41; Madrid,Spain; 40n24; 3w41; M;
01-02-1784-01:00:00| Duke of Saxe-Coburg and Gotha Ernst I; 2.1.1784; 01:00; +00:10:58; Coburg,Germany; 50n15; 10e58; M;
所需的输出文件 01-01.zbs:
Stefan Reinartz; 1.1.1989; 06:30; +01; Engelskirchen,Germany; 50n59; 7e24; M;
Dawid Kwiatkowski; 1.1.1996; 08:40; +01; Gorzów Wielkopolski,Poland; 52n44; 15e15; M;
Liam Flockhart; 1.1.2001; 01:30; -08; San Diego,California; 32n43; 117w09; M;
输出文件 01-02.zbs:
King of Poland Sigismund I the Old; 2.1.1467; 00:20; +00:21:33; Kozienice,Poland; 51n35; 21e33; M;
Duke of Rambouillet Louis Marie; 2.1.1746; 09:00; -00:03:41; Madrid,Spain; 40n24; 3w41; M;
Duke of Saxe-Coburg and Gotha Ernst I; 2.1.1784; 01:00; +00:10:58; Coburg,Germany; 50n15; 10e58; M;
我在开头按一年中的每一天对它们进行排序,并相应地拆分文件。但我不想输出每行的前 21 个字符,所以我尝试使用正则表达式组来执行此操作,如下所示:
re.search("^[0-9]{2}-[0-9]{2}-[0-9]{4}-[0-9]{2}:[0-9]{2}:[0-9]{2}| (.*)",line[0])
re.search("^.{21}(.*)",line[0])
但是,如何使用组(.*) \1 只输出那部分? 甚至需要正则表达式来做到这一点吗?
这是完整的代码:我是 python 的初学者,所以代码可能有很大的错误:
import re
with open("database.txt") as f:
pstring='' #previous line string beginning
astring='' #actual line string beginning
try:
out = open(re.search("^[0-9]{2}-[0-9]{2}",line[0]) + ".zbs", "w")
for line in f:
astring = re.search("^[0-9]{2}-[0-9]{2}-",line[0])
if not pstring = astring:
out.write(line)
pstring = re.search("^[0-9]{2}-[0-9]{2}-",line[0])
if out: out.close()
out = open(re.search("^[0-9]{2}-[0-9]{2}",line[0]) + ".zbs", "w")
else:
pstring = re.search("^[0-9]{2}-[0-9]{2}-",line[0])
out.write(line)
finally:
out.close()
此致。
让我们考虑文件中的一行:
line = "01-01-1989-06:30:00| Stefan Reinartz; 1.1.1989; 06:30; +01; Engelskirchen,Germany; 50n59; 7e24; M;"
如果你想去除一行的前 21 个字符,那么你可以简单地使用所谓的切片,如下所示:
>>> print(line[21:])
Stefan Reinartz; 1.1.1989; 06:30; +01; Engelskirchen,Germany; 50n59; 7e24; M;
(查看 this 站点以了解有关通过切片检索子字符串的更多详细信息。)
现在,如果您需要提取这样一行的部分内容,那么您确实可以使用正则表达式。如您所述,要获取日期的各个部分,您可以使用例如具有如下命名组的模式:
import re
p = r"[^\;]+; (?P<day>[0-9]+)\.(?P<month>[0-9]+)\.(?P<year>[0-9]+)"
m = re.match(p, line)
然后可以像这样访问匹配的组:
>>> m.group("day")
'1'
>>> m.group("month")
'1'
>>> m.group("year")
'1989'
(当然,您可以通过直接从一行的开头提取日期来更轻松地获取日期,但这只是一个演示命名组用法的示例。)