python - 使用正则表达式量词python时的关键错误

原文 标签 python regex pandas

我试图在 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/

    相关文章:

    python - 过滤掉包含非字母数字字符的行

    python - 如何使用可变长度字符串解码 TFRecord 数据样本?

    python - 为什么 random.sample 比 numpy 的 random.choice 快?

    regex - iTerm2 触发器不区分大小写

    python - 在数据框上应用条件lambda语句

    python - 无法将大小为 1665179 的数组 reshape 为形状 (512,512,3,3)

    javascript - 从字符串中提取嵌入的数字-JavaScript正则表达式

    python - 如何处理空的“DataFrame”:没有数字数据可绘制错误以在图形上采用字符串

    python - 如何创建一个列来跟踪另一列中的值出现的次数,直到 Pandas 中的该行

    regex - 正则表达式匹配美国键盘上的所有字符