我正在 try catch 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}
- 一个非捕获*组,匹配 3、4 或 5 个 1+ 空格,后跟 1+ 非空格字符
-
请注意,非捕获组旨在对某些模式进行分组,或量化它们,而不实际为它们匹配的值分配任何内存缓冲区,以便您可以仅捕获您需要返回/保留的内容。
关于python - 使用正则表达式量词 python 时出现关键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62133480/