如何从字符串中过滤掉特定的字符串
How to filter out specific strings from a string
Python 初学者。对于我正在编写的机器人,我对这段代码的一部分感到困惑。
我正在制作一个使用 Praw 的 reddit 机器人来梳理 posts 并删除一组特定的字符(steam CD 键)。
我在这里做了一个测试post:https://www.reddit.com/r/pythonforengineers/comments/91m4l0/testing_my_reddit_scraping_bot/
这应该有所有的密钥格式。
目前,我的机器人能够使用正则表达式找到 post。我有这些变量:
steamKey15 = (r'\w\w\w\w\w.\w\w\w\w\w.\w\w\w\w\w')
steamKey25 = (r'\w\w\w\w\w.\w\w\w\w\w.\w\w\w\w\w.\w\w\w\w\w.\w\w\w\w\w.')
steamKey17 = (r'\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\s\w\w')
我正在使用这个查找文本:
subreddit = reddit.subreddit('pythonforengineers')
for submission in subreddit.new(limit=20):
if submission.id not in steamKeyPostID:
if re.search(steamKey15, submission.selftext, re.IGNORECASE):
searchLogic()
saveSteamKey()
所以这只是为了表明我应该在过滤器函数中使用的东西是 steamKey15/25/17 和 submission.selftext 的组合。
所以这是我感到困惑的部分。我找不到有效的功能,或者正在做我想做的事。我的目标是从 submission.selftext(post 的正文)中删除所有文本,但删除键,这些键最终将保存在 .txt 文件中。
关于解决这个问题的好方法有什么建议吗?我研究了 re.sub 和 .translate,但我不明白这些部分是如何组合在一起的。
如果有帮助,我正在使用 Python 3.7。
你不能只得到正则表达式的结果吗?
m = re.search(steamKey15, submission.selftext, re.IGNORECASE)
if m:
print(m.group(0))
另请注意,点 .
表示正则表达式中的 任何字符 。如果你只想匹配点,你应该使用 \.
。你可能可以这样写你的正则表达式:
r'\w{5}[-.]\w{5}[-.]\w{5}'
这将匹配由 .
或 -
分隔的密钥。
请注意,这也会匹配任何以键开头或结尾,或中间有键的内容 - 这可能会给您带来问题,因为您的 15 字符键正则表达式包含在 25 键正则表达式中!要解决这个问题,请使用负 lookahead/negative 回顾:
r'(?<![\w.-])\w{5}[-.]\w{5}[-.]\w{5}(?![\w.-])'
只有在键前后没有无关字符的情况下才会找到键
另一个提示是使用 re.findall
而不是 re.search
- 一些 post 在同一个 post 中包含多个 Steam 密钥! findall
将 return 所有匹配项,而 search
仅 return 第一个。
首先要注意几点 .
表示正则表达式中的任何字符。我想你知道这一点,但只是为了确定。 \w\w\w\w\w
也可以替换为 \w{5}
,其中指定 5 个字母数字。我会使用 re.findall
.
import re
steamKey15 = (r'(?:\w{5}.){2}\w{5}')
steamKey25 = (r'(?:\w{5}.){5}')
steamKey17 = (r'\w{15}\s\w\w')
subreddit = reddit.subreddit('pythonforengineers')
for submission in subreddit.new(limit=20):
if submission.id not in steamKeyPostID:
finds_15 = re.findall(steamKey15, submission.selftext)
finds_25 = re.findall(steamKey25, submission.selftext)
finds_17 = re.findall(steamKey17, submission.selftext)
Python 初学者。对于我正在编写的机器人,我对这段代码的一部分感到困惑。
我正在制作一个使用 Praw 的 reddit 机器人来梳理 posts 并删除一组特定的字符(steam CD 键)。
我在这里做了一个测试post:https://www.reddit.com/r/pythonforengineers/comments/91m4l0/testing_my_reddit_scraping_bot/
这应该有所有的密钥格式。
目前,我的机器人能够使用正则表达式找到 post。我有这些变量:
steamKey15 = (r'\w\w\w\w\w.\w\w\w\w\w.\w\w\w\w\w')
steamKey25 = (r'\w\w\w\w\w.\w\w\w\w\w.\w\w\w\w\w.\w\w\w\w\w.\w\w\w\w\w.')
steamKey17 = (r'\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\s\w\w')
我正在使用这个查找文本:
subreddit = reddit.subreddit('pythonforengineers')
for submission in subreddit.new(limit=20):
if submission.id not in steamKeyPostID:
if re.search(steamKey15, submission.selftext, re.IGNORECASE):
searchLogic()
saveSteamKey()
所以这只是为了表明我应该在过滤器函数中使用的东西是 steamKey15/25/17 和 submission.selftext 的组合。
所以这是我感到困惑的部分。我找不到有效的功能,或者正在做我想做的事。我的目标是从 submission.selftext(post 的正文)中删除所有文本,但删除键,这些键最终将保存在 .txt 文件中。
关于解决这个问题的好方法有什么建议吗?我研究了 re.sub 和 .translate,但我不明白这些部分是如何组合在一起的。
如果有帮助,我正在使用 Python 3.7。
你不能只得到正则表达式的结果吗?
m = re.search(steamKey15, submission.selftext, re.IGNORECASE)
if m:
print(m.group(0))
另请注意,点 .
表示正则表达式中的 任何字符 。如果你只想匹配点,你应该使用 \.
。你可能可以这样写你的正则表达式:
r'\w{5}[-.]\w{5}[-.]\w{5}'
这将匹配由 .
或 -
分隔的密钥。
请注意,这也会匹配任何以键开头或结尾,或中间有键的内容 - 这可能会给您带来问题,因为您的 15 字符键正则表达式包含在 25 键正则表达式中!要解决这个问题,请使用负 lookahead/negative 回顾:
r'(?<![\w.-])\w{5}[-.]\w{5}[-.]\w{5}(?![\w.-])'
只有在键前后没有无关字符的情况下才会找到键
另一个提示是使用 re.findall
而不是 re.search
- 一些 post 在同一个 post 中包含多个 Steam 密钥! findall
将 return 所有匹配项,而 search
仅 return 第一个。
首先要注意几点 .
表示正则表达式中的任何字符。我想你知道这一点,但只是为了确定。 \w\w\w\w\w
也可以替换为 \w{5}
,其中指定 5 个字母数字。我会使用 re.findall
.
import re
steamKey15 = (r'(?:\w{5}.){2}\w{5}')
steamKey25 = (r'(?:\w{5}.){5}')
steamKey17 = (r'\w{15}\s\w\w')
subreddit = reddit.subreddit('pythonforengineers')
for submission in subreddit.new(limit=20):
if submission.id not in steamKeyPostID:
finds_15 = re.findall(steamKey15, submission.selftext)
finds_25 = re.findall(steamKey25, submission.selftext)
finds_17 = re.findall(steamKey17, submission.selftext)