Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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,如何只向列表中添加不同的消息?_Python_Regex - Fatal编程技术网

使用Python,如何只向列表中添加不同的消息?

使用Python,如何只向列表中添加不同的消息?,python,regex,Python,Regex,认证Python Noob。请容忍我 在包含一百万(或更多)行文本的多个文件中,我将过滤掉不同的文本。也就是说,即使这数百万条代码中只包含15行不同的代码,代码也应该返回15行 从文件中读取该行,若该行不存在,则将其放入列表中,然后将该列表输出到另一个文件。听起来很简单 不过有一件小事: 我在寻找消息,而不是字符串/子字符串,或者你所拥有的东西。我将在下面解释 问题: 假设文件中有以下行: 随机2345 你好,世界 你的代码是91939 你的密码是54879 你的密码是79865 煎饼2451

认证Python Noob。请容忍我

在包含一百万(或更多)行文本的多个文件中,我将过滤掉不同的文本。也就是说,即使这数百万条代码中只包含15行不同的代码,代码也应该返回15行

从文件中读取该行,若该行不存在,则将其放入列表中,然后将该列表输出到另一个文件。听起来很简单

不过有一件小事:

我在寻找消息,而不是字符串/子字符串,或者你所拥有的东西。我将在下面解释

问题:

假设文件中有以下行:

  • 随机2345
  • 你好,世界
  • 你的代码是91939
  • 你的密码是54879
  • 你的密码是79865
  • 煎饼2451
  • 您的验证码是123456
  • 您的验证码是789101
实际上,我应该做一个简单的
,如果行在myList中不存在,则将行添加到myList
,这样仍然会返回重复的行。输出应为:

  • 随机2345
  • 你好,世界
  • 你的代码是91939
  • 煎饼2451
  • 您的验证码是123456
我要尝试的内容:

现在,数字无关紧要,所以我可能可以简单地使用regex或其他工具来查找行中的所有数字,将它们替换为零,然后将其与列表(也删除了所有数字)进行比较

粗糙,但这是我能想到的最简单的

还和我在一起吗

更多问题:

现在是最难的部分。除上述列表外,假设我们有以下内容:

  • 嗨,我叫兰斯。很高兴认识你
  • 嗨,我叫珍妮。很高兴认识你
  • 哟,老兄。我叫约翰·埃里克。别碰我的薯条
  • 哟,老兄。我叫詹姆斯。别碰我的薯条
  • 我喜欢海龟
  • Stefan对你的视频发表了评论
  • n00bpwn3rz对您的视频发表了评论
  • RJ想和你谈谈
  • 珍妮喜欢你的照片
  • Pi想和你谈谈
  • Pi说请访问我的网站www.google.com
  • 约翰·埃里克说,请访问我的网站www.johniscool.com
  • 詹姆斯做水果冰块
输出应如下所示:

  • 嗨,我叫兰斯。很高兴认识你
  • 哟,老兄。我叫约翰·埃里克。别碰我的薯条
  • 我喜欢海龟
  • Stefan对你的视频发表了评论
  • RJ想和你谈谈
  • 珍妮喜欢你的照片
  • Pi说请访问我的网站www.google.com
  • 詹姆斯做水果冰块
我的脑子痛。我不仅要把名字作为变量,还要注意网站

现在,假设我将行分解为字符,循环将其与列表中的项目进行比较-也分解为字符-如果它达到X个正数(Char from line=Char from list_item),我不会将其添加到列表中。这是否可行(例如,准确)?我如何在代码中做到这一点?也许是这样的

line_char[] = line       #My Name is Jayson
list_char[] = list_item  #My Name is Lance

if (list_char[] contains some sequence of line_char[]):
     #My Name is Jayson = My Name is Lance (12 TRUE [My Name is ], 6 FALSE [Lance/Jayson]; 12 > 6)
     line exists in list
else:
     add line to list
还有其他想法吗?这可能更像是一个逻辑问题,但我想在Python中实现这一点,所以我只考虑它的优点和局限性

到目前为止的代码:

这里没什么可看的,伙计们

import os

in_path = "../aggregator/"
out_path = "../aggregator_output/"
# For server: for filename in os.listdir(in_path):
# For local: for filename in list_path:
list_path = os.listdir(in_path)
del list_path[0]
for filename in list_path:
    in_base, in_ext = os.path.splitext(filename)
    in_file = os.path.join(in_path, filename)
    out_file = os.path.join(out_path, in_base + "_cleaned.csv")
    print "Processing " + in_file
    print "Writing to " + out_file
    dirty_file = open(in_file, "rb").read().split("\n")
    clean_file = open(out_file "wb")
    list_unique = []
    for line in dirty_file:
        temp_line = re.sub('",', '^', line)
        delimited = temp_line.split(",")
        message = delimited[2]
到目前为止,我所有的代码都只是从文件(第3列)中筛选出正确的行

我真的很感激在这方面能得到一些帮助,因为这是一个相当有趣的问题,尽管我自己解决不了

谢谢


另外,注释掉了部分代码pre for loop是为了考虑到恼人的.DS在Mac上存储垃圾隐藏文件,这破坏了代码的其余部分。我在Mac上做测试,在ubuntu服务器上做实际的事情。

从我看来,当存在可能的“重复”时,你只想保留第一行,而不关心数字或名称

为什么不:

  • 看一行的第一个单词,如果你发现一个新的单词序列,你就把它添加到列表中
  • 比较表示两行的两个字符串,并定义一个间隔,您知道这两行是不同的
例如,在这两行之间:

  • 嗨,我叫兰斯。很高兴认识你
  • 嗨,我叫珍妮。很高兴认识你
唯一的区别是兰斯和珍妮

然后,可以根据行中所有字符的ASCII代码之和的差来编写比较函数(因为Python中不存在该函数)。并且说:如果两行的“散列”很接近,那么它们是相似的

以下是用于计算行哈希的代码示例:

class myString(str):
  def __hash__(self):
    count = 0
    for c in self:
      count += ord(c)
    return count

a = myString('Hi, my name is Lance. Pleased to meet you.')
b = myString('Hi, my name is Jenny. Pleased to meet you.')
c = myString("Yo, dawg. Name's John Erik. Don't touch my fries.")

hash(a) = 3624
hash(b) = 3657
hash(c) = 4148
希望这会有帮助!请注意,对于具有相同字符序列的句子,此解决方案可能存在问题,例如:

hash(myString('abc')) = 294
hash(myString('bac')) = 294

据我所见,当有可能的“重复”时,您只想保留第一行,而不关心数字或名称

为什么不:

  • 看一行的第一个单词,如果你发现一个新的单词序列,你就把它添加到列表中
  • 比较表示两行的两个字符串,并定义一个间隔,您知道这两行是不同的
例如,在这两行之间:

  • 嗨,我叫兰斯。很高兴认识你
  • 嗨,我叫珍妮。很高兴认识你
唯一的区别是兰斯和珍妮

然后,可以根据行中所有字符的ASCII代码之和的差来编写比较函数(因为Python中不存在该函数)。并且说:如果两行的“散列”很接近,那么它们是相似的

以下是用于计算行哈希的代码示例:

class myString(str):
  def __hash__(self):
    count = 0
    for c in self:
      count += ord(c)
    return count

a = myString('Hi, my name is Lance. Pleased to meet you.')
b = myString('Hi, my name is Jenny. Pleased to meet you.')
c = myString("Yo, dawg. Name's John Erik. Don't touch my fries.")

hash(a) = 3624
hash(b) = 3657
hash(c) = 4148
希望这会有帮助!请注意,对于具有相同字符序列的句子,此解决方案可能存在问题,例如:

hash(myString('abc')) = 294
hash(myString('bac')) = 294

依我看,你只是想
a = """Hi, my name is Lance. Pleased to meet you.
Hi, my name is Jenny. Pleased to meet you.
Yo, dawg. Name's John Erik. Don't touch my fries.
Yo, dawg. Name's James. Don't touch my fries.
I like turtles 53669
Stefan commented on your video.
n00bpwn3rz commented on your video.
RJ wants to talk to you.
Jenny liked your photo.
Pi wants to talk to you.
Pi says visit my website at www.google.com
John Erik says visit my website at www.johniscool.com
James made fruity ice cubes."""


dirty_list = a.split('\n')
clean_list = [] # list of sets containing 'unique sets'
clean_list_pure = [] # list of the original sentences stored as sets in clean_list eg the output
for line in dirty_list:
    line_set = set(line.strip().split(' '))
    if all(len(line_set.intersection(clean_set)) < len(line_set)/2 for clean_set in clean_list):
        clean_list.append(line_set)
        clean_list_pure.append(line.strip())

for cl in clean_list_pure:
    print cl