【问题标题】:Regex function to extract selected rows用于提取选定行的正则表达式函数
【发布时间】:2023-02-24 21:45:05
【问题描述】:

我有一个这样的文本文件

Some text and random stuff that I don't need

2 8 
2 9 T
4 9
1 10 
2 10 F
7 11 T

More random stuff

我应该如何构建一个正则表达式函数来提取仅包含数字的行以及包含数字和 T 或 F 的行? 到目前为止,我对代码的想法是这样的

with open(file, 'r') as log_file:
    # opening file
        file = log_file
        while True:
            line = file.readlines()
            
            # if line in regex function:

                data.append(line)
                # closing file
                break

我该如何解决这个问题?

【问题讨论】:

标签: python regex text extract


【解决方案1】:

使用这种方法,第一个 re 将仅匹配数字,第二个 re 将匹配带有字母 T 或 F 的数字。您还可以使用 for 循环而不是 while 循环。

import re

matched_data = []
with open(file, 'r') as log_file:
    data = log_file.readlines()
    
    for line in data:
        line = line.strip()
        if re.match(r'^d+ d+|[TF]$', line):
            matched_data.append(line)
    
print(matched_data)

如果某些行以一行开头并且您也想匹配这些行,则应将上面的行模式替换为r'^[TF]|d+ d+|[TF]$'
测试代码:

import re

data = """
2 8 
2 9 T
4 9
1 10 
2 10 F
7 11 T
5 B 37
10 9 G
17 6 Z
"""

data = data.splitlines()
matched_data = []
for line in data:
    line = line.strip()
    if re.match(r'^d+ d+|[TF]$', line):
        matched_data.append(line)
    
print(matched_data)
# ['2 8', '2 9 T', '4 9', '1 10', '2 10 F', '7 11 T']

【讨论】:

    【解决方案2】:

    我们可以使用re.findall() 来获取整个文件中的所有事件。

    import re
    
    regexp = r"^d[d ]*[T|F]?"
    
    with open("file.txt", "r") as fp:
        # Not suggested if the file is large.
        data = fp.read()
        print(re.findall(regexp, data, re.M))
    

    输出:

    ['2 8 ', '2 9 T', '4 9', '1 10 ', '2 10 F', '7 11 T']
    

    对于大文件,最好逐行迭代。

    data = []
    with open(file, 'r') as fp:
        for line in fp:
            _match = re.match(regexp, line)
            if _match:
                data.append(_match.group())
    
    

    如果你有兴趣了解更多关于正则表达式的知识,请访问regexone

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多