如何将正则表达式 pattern.finditer 写入数据框
how to write regex pattern.finditer into a dataframe
我正在尝试将正则表达式写入 select 我想要从语料库中提取的文本,然后将提取的文本写入 CSV 格式的数据框中。
这是我使用的代码:
import re
import pandas as pd
def main():
pattern = re.compile(r'(case).(reason)(.+)(})')
with open('/Users/cleantext.txt', 'r') as f:
content = f.read()
matches = pattern.finditer(content)
for match in matches:
print(tuple(match.groups()))
# Create a DF for the expenses
df = pd.DataFrame(data=[tuple(match.groups())])
df.to_csv("judgement.csv", index=True)
if __name__ == '__main__':
main()
但是 CSV 只会 return 一行输出:
,0,1,2,3
0,xxx,yyy,zzz,}
因为语料库包含至少 100 个司法判决,所以我期待多行。
原始语料库看起来像这样:
{mID a9d50454f624 case xxx reason yyy judgement zzz}
{mID a9d5049e34e934bff9b case xxx reason yyy judgement zzz}
{mID a67c9e34e934bff9b case xxx reason yyy judgement zzz}
非常感谢您的帮助。
您可能需要从每个匹配项中获取表示 case
和 reason
的两个子字符串。
您可以使用
pattern = re.compile(r'\bcase\s*(?P<Case>.*?)\s*reason\s*(?P<Reason>.*?)\s*judgement')
matches = [x.groupdict() for x in pattern.finditer(content)]
df = pd.DataFrame(matches)
注意命名的捕获组用于自动创建列名,x.groupdict()
returns 一个包含组名及其值的元组。
[x.groupdict() for x in pattern.finditer(content)]
returns 可用于填充数据框的列表字典。
您也可以使用
matches = pattern.findall(content)
df=pd.DataFrame(matches, columns=['Case', 'Reason'])
参见 the regex demo。 详情:
\bcase
- 一个完整的单词 case
\s*
- 零个或多个空格
(?P<Case>.*?)
- “Case”组:除换行字符外的零个或多个字符,尽可能少
\s*reason\s*
- reason
包含可选空格的单词
(?P<Reason>.*?)
- 组“原因”:除换行字符外的零个或多个字符,尽可能少
\s*judgement
- 零个或多个空格,然后是 judgement
字符串。
我正在尝试将正则表达式写入 select 我想要从语料库中提取的文本,然后将提取的文本写入 CSV 格式的数据框中。
这是我使用的代码:
import re
import pandas as pd
def main():
pattern = re.compile(r'(case).(reason)(.+)(})')
with open('/Users/cleantext.txt', 'r') as f:
content = f.read()
matches = pattern.finditer(content)
for match in matches:
print(tuple(match.groups()))
# Create a DF for the expenses
df = pd.DataFrame(data=[tuple(match.groups())])
df.to_csv("judgement.csv", index=True)
if __name__ == '__main__':
main()
但是 CSV 只会 return 一行输出:
,0,1,2,3
0,xxx,yyy,zzz,}
因为语料库包含至少 100 个司法判决,所以我期待多行。
原始语料库看起来像这样:
{mID a9d50454f624 case xxx reason yyy judgement zzz}
{mID a9d5049e34e934bff9b case xxx reason yyy judgement zzz}
{mID a67c9e34e934bff9b case xxx reason yyy judgement zzz}
非常感谢您的帮助。
您可能需要从每个匹配项中获取表示 case
和 reason
的两个子字符串。
您可以使用
pattern = re.compile(r'\bcase\s*(?P<Case>.*?)\s*reason\s*(?P<Reason>.*?)\s*judgement')
matches = [x.groupdict() for x in pattern.finditer(content)]
df = pd.DataFrame(matches)
注意命名的捕获组用于自动创建列名,x.groupdict()
returns 一个包含组名及其值的元组。
[x.groupdict() for x in pattern.finditer(content)]
returns 可用于填充数据框的列表字典。
您也可以使用
matches = pattern.findall(content)
df=pd.DataFrame(matches, columns=['Case', 'Reason'])
参见 the regex demo。 详情:
\bcase
- 一个完整的单词case
\s*
- 零个或多个空格(?P<Case>.*?)
- “Case”组:除换行字符外的零个或多个字符,尽可能少\s*reason\s*
-reason
包含可选空格的单词(?P<Reason>.*?)
- 组“原因”:除换行字符外的零个或多个字符,尽可能少\s*judgement
- 零个或多个空格,然后是judgement
字符串。