在 Python 中使用正则表达式从文本中提取列表
Extracting a List from Text using Regular Expression in Python
我希望从以下字符串中提取元组列表:
text='''Consumer Price Index:
+0.2% in Sep 2020
Unemployment Rate:
+7.9% in Sep 2020
Producer Price Index:
+0.4% in Sep 2020
Employment Cost Index:
+0.5% in 2nd Qtr of 2020
Productivity:
+10.1% in 2nd Qtr of 2020
Import Price Index:
+0.3% in Sep 2020
Export Price Index:
+0.6% in Sep 2020'''
我正在使用 'import re' 进行处理。
输出应该是这样的:[('Consumer Price Index', '+0.2%', 'Sep 2020'), ...]
我想使用生成上述输出的 re.findall 函数,到目前为止我有这个:
re.findall(r"(:\Z)\s+(%\Z+)(\Ain )", text)
我要识别“:”之前的字符,然后是“%”之前的字符,然后是 'in' 之后的字符。
我真的不知道如何继续。任何帮助,将不胜感激。谢谢!
您可以使用
re.findall(r'(\S.*):\n\s*(\+?\d[\d.]*%)\s+in\s+(.*)', text)
# => [('Consumer Price Index', '+0.2%', 'Sep 2020'), ('Unemployment Rate', '+7.9%', 'Sep 2020'), ('Producer Price Index', '+0.4%', 'Sep 2020'), ('Employment Cost Index', '+0.5%', '2nd Qtr of 2020'), ('Productivity', '+10.1%', '2nd Qtr of 2020'), ('Import Price Index', '+0.3%', 'Sep 2020'), ('Export Price Index', '+0.6%', 'Sep 2020')]
参见regex demo and the Python demo。
详情
(\S.*)
- 第 1 组:一个 non-whitespace 字符后跟任何零个或多个字符(换行符字符除外)尽可能多
:
- 冒号
\n
- 一个换行符
\s*
- 0 个或更多空格
(\+?\d[\d.]*%)
- 第 2 组:可选 +
,一个数字,零个或多个 digits/dots,以及一个 %
\s+in\s+
- in
包含 1+ 个空格
(.*)
- 第 3 组:除换行字符外的任何零个或多个字符尽可能多
正则表达式不是解决此问题的好方法。它很难快速阅读和维护。使用 pythons 字符串函数可以做得更干净:
list_of_lines = [
line.strip() # remove trailing and leading whitespace
for line in text.split("\n") # split up the text into lines
if line # filter out the empty lines
]
list_of_lines
现在是:
['Consumer Price Index:', '+0.2% in Sep 2020', 'Unemployment Rate:', '+7.9% in Sep 2020', 'Producer Price Index:', '+0.4% in Sep 2020', 'Employment Cost Index:', '+0.5% in 2nd Qtr of 2020', 'Productivity:', '+10.1% in 2nd Qtr of 2020', 'Import Price Index:', '+0.3% in Sep 2020', 'Export Price Index:', '+0.6% in Sep 2020']
现在我们所要做的就是从这个列表的成对元素构建元组。
def pairwise(iterable):
"s -> (s0, s1), (s2, s3), (s4, s5), ..."
a = iter(iterable)
return zip(a, a)
(来自 here)
现在我们可以得到我们想要的输出:
print(pairwise(list_of_lines))
[('Consumer Price Index:', '+0.2% in Sep 2020'), ('Unemployment Rate:', '+7.9% in Sep 2020'), ('Producer Price Index:', '+0.4% in Sep 2020'), ('Employment Cost Index:', '+0.5% in 2nd Qtr of 2020'), ('Productivity:', '+10.1% in 2nd Qtr of 2020'), ('Import Price Index:', '+0.3% in Sep 2020'), ('Export Price Index:', '+0.6% in Sep 2020')]
我希望从以下字符串中提取元组列表:
text='''Consumer Price Index:
+0.2% in Sep 2020
Unemployment Rate:
+7.9% in Sep 2020
Producer Price Index:
+0.4% in Sep 2020
Employment Cost Index:
+0.5% in 2nd Qtr of 2020
Productivity:
+10.1% in 2nd Qtr of 2020
Import Price Index:
+0.3% in Sep 2020
Export Price Index:
+0.6% in Sep 2020'''
我正在使用 'import re' 进行处理。
输出应该是这样的:[('Consumer Price Index', '+0.2%', 'Sep 2020'), ...]
我想使用生成上述输出的 re.findall 函数,到目前为止我有这个:
re.findall(r"(:\Z)\s+(%\Z+)(\Ain )", text)
我要识别“:”之前的字符,然后是“%”之前的字符,然后是 'in' 之后的字符。
我真的不知道如何继续。任何帮助,将不胜感激。谢谢!
您可以使用
re.findall(r'(\S.*):\n\s*(\+?\d[\d.]*%)\s+in\s+(.*)', text)
# => [('Consumer Price Index', '+0.2%', 'Sep 2020'), ('Unemployment Rate', '+7.9%', 'Sep 2020'), ('Producer Price Index', '+0.4%', 'Sep 2020'), ('Employment Cost Index', '+0.5%', '2nd Qtr of 2020'), ('Productivity', '+10.1%', '2nd Qtr of 2020'), ('Import Price Index', '+0.3%', 'Sep 2020'), ('Export Price Index', '+0.6%', 'Sep 2020')]
参见regex demo and the Python demo。
详情
(\S.*)
- 第 1 组:一个 non-whitespace 字符后跟任何零个或多个字符(换行符字符除外)尽可能多:
- 冒号\n
- 一个换行符\s*
- 0 个或更多空格(\+?\d[\d.]*%)
- 第 2 组:可选+
,一个数字,零个或多个 digits/dots,以及一个%
\s+in\s+
-in
包含 1+ 个空格(.*)
- 第 3 组:除换行字符外的任何零个或多个字符尽可能多
正则表达式不是解决此问题的好方法。它很难快速阅读和维护。使用 pythons 字符串函数可以做得更干净:
list_of_lines = [
line.strip() # remove trailing and leading whitespace
for line in text.split("\n") # split up the text into lines
if line # filter out the empty lines
]
list_of_lines
现在是:
['Consumer Price Index:', '+0.2% in Sep 2020', 'Unemployment Rate:', '+7.9% in Sep 2020', 'Producer Price Index:', '+0.4% in Sep 2020', 'Employment Cost Index:', '+0.5% in 2nd Qtr of 2020', 'Productivity:', '+10.1% in 2nd Qtr of 2020', 'Import Price Index:', '+0.3% in Sep 2020', 'Export Price Index:', '+0.6% in Sep 2020']
现在我们所要做的就是从这个列表的成对元素构建元组。
def pairwise(iterable):
"s -> (s0, s1), (s2, s3), (s4, s5), ..."
a = iter(iterable)
return zip(a, a)
(来自 here)
现在我们可以得到我们想要的输出:
print(pairwise(list_of_lines))
[('Consumer Price Index:', '+0.2% in Sep 2020'), ('Unemployment Rate:', '+7.9% in Sep 2020'), ('Producer Price Index:', '+0.4% in Sep 2020'), ('Employment Cost Index:', '+0.5% in 2nd Qtr of 2020'), ('Productivity:', '+10.1% in 2nd Qtr of 2020'), ('Import Price Index:', '+0.3% in Sep 2020'), ('Export Price Index:', '+0.6% in Sep 2020')]