我试图在 Pandas df 中捕捉指定股票之后的单词。我有几只股票,格式为 $IBM
并且我正在设置一个 python 正则表达式模式来搜索每条推文中的 3-5 个单词,如果找到的话。
我的 df 叫 stock_news
看起来像这样:
Word Count
0 $IBM 10
1 $GOOGL 8
etc
pattern = ''
for word in stock_news.Word:
pattern += '{} (\w+\s*\S*){3,5}|'.format(re.escape(word))
但是我的理解是
{}
应该是一个量词,在我的情况下匹配 3 到 5 次,但是我收到以下 KeyError
:KeyError: '3,5'
我也试过在
r'{} (\w+\s*\S*){3,5}|'
中使用原始字符串但无济于事。我也尝试在 regex101 上使用这种模式,它似乎在那里工作,但在我的 Pycharm IDE 中不起作用。任何帮助,将不胜感激。查找代码:
pat = re.compile(pattern, re.I)
for i in tweet_df.Tweets:
for x in pat.findall(i):
print(x)
最佳答案
当您构建您的模式时,末尾有一个空的替代项,因此您的模式有效地匹配任何字符串,非匹配文本之前的每个空格。
你需要建立这样的模式
(?:\$IBM|\$GOOGLE)\s+(\w+(?:\s+\S+){3,5})
您可以使用
pattern = r'(?:{})\s+(\w+(?:\s+\S+){{3,5}})'.format(
"|".join(map(re.escape, stock_news['Word'])))
请注意 f 字符串或格式字符串中的文字花括号必须加倍 .
正则表达式详情
(?:\$IBM|\$GOOGLE)
- 一个 non-capturing group匹配任一 $IBM
或 $GOOGLE
\s+
- 1+ 个空格 (\w+(?:\s+\S+){3,5})
- 捕获第 1 组(当使用 str.findall
时,只会返回这部分):\w+
- 1+字字符(?:\s+\S+){3,5}
- 匹配三个、四个或五个 1+ 空格后跟 1+ 个非空格字符的非捕获*组 请注意,非捕获组旨在对某些模式进行分组或量化它们,而不实际为它们匹配的值分配任何内存缓冲区,以便您只能捕获需要返回/保留的内容。
关于python - 使用正则表达式量词python时的关键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62133480/