【问题标题】:Check if string exists in a text file检查文本文件中是否存在字符串
【发布时间】:2014-12-11 01:50:13
【问题描述】:

所以我有:

def CheckUserExists(user):
    with open("C:/~/database.txt", 'r') as file:
        if re.search(user, file.read()):
            return True
        else:
            return False

username = input("Please enter you Username: ")
if CheckUserExists(username) == True:
    print("You exist!")
else:
    print("This user does not exist...")

但是,例如,如果您输入字母“a”并且是一个名为“brain”的用户;搜索获取 a 并返回 True。如何搜索整个单词?

我看过这里:How to check in Python if string is in a text file and print the line? 但是我不明白这段代码:

re.search("\b{0}\b".format(w),line)

【问题讨论】:

  • \b 用于单词边界。
  • RE 看起来有点矫枉过正,为什么不看看if user in file.read()。或者逐行读取文件。
  • 这个文件的格式是什么?
  • 文件为文本文件;如果 file.read() 中的用户仍然为单词中的字母返回 True
  • 加一个,有趣的问题

标签: python regex


【解决方案1】:

正则表达式\b、refers to the empty string at a word boundary,其中单词为\w+或[A-Za-z0-9_]+

如果您每行有一个名称(名称周围没有其他空格),您可以使用^{0}$ 和re.M 或re.MULTILINE 标志逐行搜索

看起来像这样:

def CheckUserExists(user):
    with open("C:/~/database.txt", 'r') as file:
        if re.search('^{0}$'.format(re.escape(user)), file.read(), flags=re.M):
            return True
        else:
            return False

username = input("Please enter you Username: ")
if CheckUserExists(username): # it's redundant to check if == True here
    print("You exist!")
else:
    print("This user does not exist...")

虽然评论和答案建议,如果你这样做

if user in file.read()

你可能有误报。

【讨论】:

  • 使用return bool(x) 而不是if x: return True else: return False。使用if x: 而不是if x == True:
  • 如果user 可能包含正则表达式元字符,您需要'^{}$'.format(re.escape(user))。
  • @J.F.Sebastian 你能给我一个这样的名字的例子吗?不,这可能是个好主意,我想打败恶意目的。 :D
  • 示例:J.F.Sebastian(. 在正则表达式中具有特殊含义)。除非您打算允许使用正则表达式模式搜索用户;你应该转义输入。
  • @J.F.Sebastian 我宁愿做一个验证,但在这一点上它超出了我认为的问题范围。
【解决方案2】:

检查文件中是否存在空格分隔的单词:

with open(filename) as file:
    found = (word in file.read().split())

或相同但逐行读取而不是全部加载到内存中:

with open(filename) as file:
    found = any(word in line.split() for line in file)

如果文件的格式是每行一个单词(/user):

with open(filename) as file:
    found = any(word == line.strip() for line in file)

在简单的情况下,您不需要正则表达式。如果每行可能有多个单词并且其中可能有任意标点符号,那么您可以使用您链接的正则表达式:

import re

matched = re.compile(r"\b" + re.escape(word) + r"\b").search
with open(filename) as file:
    found = any(matched(line) for line in file)

\b 正则表达式匹配单词边界(单词的开头或结尾)。单词字符是字母、数字和下划线。 re.escape() 用于word 包含正则表达式元字符,例如*。

【讨论】:

  • 直接使用return (word in file.read().split())会进一步缩短OP的功能,并且仍然有效。
【解决方案3】:

您引用的代码行是regular expression。基本上它在这种情况下所做的是确保在您正在搜索的字符串周围存在一个单词边界(用\b 指定),这将防止像您看到的那样匹配子字符串。

【讨论】:

    【解决方案4】:

    正则表达式似乎有点过于复杂了...我将使用.split() 来划分文件中的每一行

    def CheckUserExists(user):
      with open("C:/~/database.txt", 'r') as file:
        for line in file:
          if user in line.split():
            return True
        else:
          return False
    

    这对于一个database.txt 文件使'''like''' 一个用户之间有空格的数据库。 我们需要对源数据进行少量提取,以便为您提供一致的答案。

    如果用户由特殊字符(引号、句点、逗号等)分隔,我将使用.replace("delimitingcharacter", " ")..

    def CheckUserExists(user):
      with open("C:/~/database.txt", 'r') as file:
        for line in file:
          for word in line.split():
            if user in word.replace(';', ' '):
              return True
            else:
              return False
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 2011-09-30
      • 2021-10-07
      • 2013-03-01
      • 2019-02-27
      相关资源
      最近更新 更多