如何在Python中创建用于标记Java源代码的正则表达式

时间:2019-06-11 19:33:36

标签: python regex

大家好,我一直在从事一个有趣的项目,涉及python中的ML和一些Java源代码。基本上,我需要使用正则表达式标记Java代码的每一行,但不幸的是,我无法做到这一点。

在过去的几天里,我一直在尝试创建自己的正则表达式模式,其中包括大量的谷歌搜索和Youtubing,因为我不知道自己该怎么做(我也不认为现在也该怎么做) :()。我尝试使用库来进行标记化,但是这些库的工作方式确实很奇怪,例如有时遗漏分号和方括号,有时却没有。

def stringTokenizer(string):
    tokens = re.findall(r"[\w']+|[""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~""\\]", string);
    print(tokens);

stringTokenizer('void addAction(String commandId, IHandler action);');

最初,我希望能够获得以下输出: ['void','addAction','(','String','commandId','IHandler','action',')',';']但可悲的是,这是我最接近结果的结果[' void','addAction(','String','commandId','IHandler','action);']

如果有人可以帮助您,您将成为救生员。

1 个答案:

答案 0 :(得分:1)

您要匹配1个以上单词的块或单撇号字符或除空格以外的所有其他字符的单次出现。

因此,您需要

re.findall(r"[\w']+|[^\w\s']", s)

当您需要将单词字符之间的'匹配为单词块时,您可能会考虑使用此表达式:

re.findall(r"\w+(?:'\w+)*|[^\w\s]", s)
             ^^^^^^^^^^^^

请参见regex demoregex graph

enter image description here

详细信息

  • [\w']+-一个positive character class,与一个或多个单词字符(字母,数字,下划线,以及一些被认为是“单词”的稀有字符)匹配
  • |-或
  • [^\w\s']-一个negated character class,与除单词,空格字符和单撇号之外的任意1个字符匹配。
  • \w+(?:'\w+)*匹配1+个单词字符,后跟0个或多个重复的'和1+个单词字符。