Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-如果行包含x且不以ip地址结尾_Python_If Statement - Fatal编程技术网

Python-如果行包含x且不以ip地址结尾

Python-如果行包含x且不以ip地址结尾,python,if-statement,Python,If Statement,我是python新手,希望能得到一些帮助/建议 我有一个文本文件,如果满足/不满足某些条件,我需要在其中添加新行。 我需要在每一行中查找包含“rightid=”后跟IP地址或名称的行 如果该行在“rightid=”之后不包含IP地址,则在下面添加一行文字,如果该行包含IP地址,则不执行任何操作 为了澄清,我需要在包含“rightid=”而不是IP地址的行下面的文本文件中添加一行新行。 因此,如果它看到“rightid=192.168.1.1”(或任何IP),则忽略它;如果它看到“rightid=

我是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:
任何帮助都将是惊人的

谢谢

文档:


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

请注意,试图通过指定
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)将输出写入新文件,临时文件,并在成功完成后删除原始文件并重命名临时文件。

此答案的可能副本可能适用于Python实现此类任务。这可能不是正确的ip地址正则表达式。如果您想更改它,这里有另一个很好的资源:不,不,不。通过“#在此处添加新行”写入的任何数据都将放在文件末尾,而不是放在包含“righid=”的行下面。用户需要匹配一个ip地址或名称。谢谢你的帮助,这看起来就像我想要的。为了澄清,我需要在包含“rightid=”而不是IP地址的行下面的文本文件中添加一行新行。因此,如果它看到“rightid=192.168.1.1”(或任何IP),则忽略它,如果它看到“rightid=randomname”,则在文本文件中相关行下方添加一行新行,并附上一些文本,为帮助Ronald干杯。我使用了你的第二个示例,并更改了正则表达式。regex=re.compile(r'rightid=[^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$]')@MultiPass我认为您没有正确使用
[^]
。如果您试图查找那些没有
rightid=
后跟IP地址的行,请让您的正则表达式匹配(您将实际使用
re.search
)后跟IP地址的
rightid=
,当它失败时,您知道要输出额外的行。因为你说唯一的选择是
rightid=
后面跟一个名字,我认为它是以一个单词字符开头的,所以我采取了相反的方法。我确实更新了我的正则表达式--我有点大脑冻结,忘记了
\w
也可以匹配数字和字母字符。我已将
\w+
替换为
\D+
,这是一个或多个非数字字符。您甚至不需要
+
。很抱歉给你带来了困惑。
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)