【问题标题】:Python - if line contans x and doesnt end with an ip addressPython - 如果行包含 x 并且不以 ip 地址结尾
【发布时间】:2019-11-26 14:50:45
【问题描述】:

我对 python 很陌生,希望得到一些帮助/建议。

我有一个文本文件,如果某些条件满足/不满足,我需要添加一个新行。 我需要查看每一行是否包含“rightid=”后跟 IP 地址或名称的行。

如果该行在 "rightid=" 之后不包含 IP 地址,则在下面添加一个带有一些文本的新行,如果它包含 IP 则什么也不做。

为了澄清,我需要在包含“rightid =”而不是 IP 地址的行下方的文本文件中添加一个新行。 因此,如果它看到“rightid=192.168.1.1”(或任何 IP)然后忽略它,如果它看到“rightid=randomname”然后在有问题的行下方的文本文件中添加一个新行。

我假设我应该使用某种正则表达式,但我对如何构建代码以及如何在下面添加新行一无所知

以下是我所知道的

with open (filename, 'r+') as file:
        data = file.read()
        for line in data:
            if "rightid=" in line:

任何帮助都会很棒。

谢谢

【问题讨论】:

标签: python if-statement


【解决方案1】:

理想情况下,解决方案如下(不是,但下一个编码示例是):

import re

regex = re.compile(r'rightid=\D+')
with open (filename, 'r+', buffering=0) as f:
    for line in f:
        if regex.search(line):
            print('Extra line', file=f)

注意通过指定buffering=0 以非缓冲模式打开输入文件的尝试。在这种模式下,您希望一次只读取一行文件,以便print 语句将导致在刚刚读取的行下方立即输出额外的行。但此模式仅适用于二进制文件。因此,要在二进制模式下工作,我们使用字节字符文字:

import re, os

regex = re.compile(rb'rightid=\D+')
with open (filename, 'rb+', buffering=0) as f:
    for line in f:
        if regex.search(line):
            f.write(b'Extra line' + os.linesep.encode())

如果你坚持使用字符串,那么:

import re

regex = re.compile(r'rightid=\D+')
with open (filename, 'r') as f:
    lines = [line for line in f]
with open(filename, 'w') as f:
    for line in lines:
        print(line, file=f, end='')
        if regex.search(line):
            print('Extra line', file=f)

首先读取文件并拆分信息行,然后重新打开以进行输出重写整个文件。这里的危险是计算机可能会在操作过程中停机。因此,您应该 (1) 首先备份原始文件(我的选择)或 (2) 将输出写入新的临时文件,并在成功完成后删除原始文件并重命名临时文件。

【讨论】:

  • 为罗纳德的帮助干杯。我使用您的第二个示例并更改了正则表达式。正则表达式 = re.compile(r'rightid=[^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$]')
  • @MultiPass 我认为您没有正确使用[^]。如果您要查找那些没有rightid= 后跟IP 地址的行,请让您的正则表达式match(您实际上将使用re.searchrightid= 后跟IP 地址当它失败时,你知道要拿出多余的线。既然你说唯一的其他选择是 rightid= 后跟一个名字,我认为它的意思是它以单词字符开头,我采取了相反的方法。
  • 我确实更新了我的正则表达式——我忘记了\w 也可以匹配数字和字母字符,这让我有点头脑发热。我已将\w+ 替换为\D+,这是一个或多个非数字字符。你真的不需要+。很抱歉造成混乱。
【解决方案2】:

文档:https://docs.python.org/3/library/re.html

import re

with open (filename, 'r+') as file:
  data = file.read()
  new_data = ''
  for line in data:
  if "rightid=" in line:
    ip_exists=re.match(r"[^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$]", line)
    if not ip_exists:
      new_data += line
      new_data += # Extra Info Here
    else:
      new_data += line
  with open(filename, 'w') as file:
    file.write(new_data)

【讨论】:

  • 这可能不是正确的 IP 地址正则表达式。如果你想改变它,这里有另一个很好的资源:@​​987654322@
  • 不,不,不。通过 '#add new line with text here` 写入的任何数据都将位于文件末尾,not 在具有“righid=”的行下方。并且用户需要匹配一个ip地址一个名字。
  • 感谢您的帮助,这看起来就像我所追求的。为了澄清我需要在包含“rightid =”而不是IP地址的行下方的文本文件中添加一个新行。因此,如果它看到“rightid=192.168.1.1”(或任何 IP)然后忽略它,如果它看到“rightid=randomname”然后在有问题的行下方的文本文件中添加一个新行
猜你喜欢
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多