正则表达式在另一个单词前添加字符(从选项列表中)
我在阅读这篇文章时,得到了使用分组的想法。
我想在/O、/ORGANIZATION、/PEOPLE或/LOCATION后面的字符前面加一个\t。
我现在有以下内容:
'The/O\nSkoll/ORGANIZATION\nFoundation/ORGANIZATION\n,/O\nbased/O\nin/O\nSilicon/LOCATION\nValley/LOCATION\na'
我想要的结果是:
The\t/O\nSkoll\t/ORGANIZATION\nFoundation\tORGANIZATION\n
我试过这个,但它不管用。我该如何记住正则表达式捕获了哪个组织呢?
x = str(t)
x = re.sub('\/(ORGANIZATION|LOCATION|PERSON|O)','\t\1', x)
这是我目前的解决方案,不过如果能用一行代码搞定就更好了。
x = re.sub(r'\/(ORGANIZATION)',r'\t\1', x)
x = re.sub(r'\/(LOCATION)', r'\t\1',x)
x = re.sub(r'\/(PERSON)',r'\t\1', x)
x = re.sub(r'\/(O)',r'\t\1', x)
4 个回答
1
你需要用到一种叫做负向前瞻断言的东西(语法是(?!...)
,其中...
是你想要匹配的内容),这样才能区分/O
和/ORGANIZATION
。我建议你可以这样做:
x = str(t)
x = re.sub(r'\/(ORGANIZATION|LOCATION|PERSON|O(?!R))','\t\\1', x)
要注意,前瞻断言是以(?
开头的,所以它不会形成一个编号的组,因此你在替换字符串中仍然需要提取组。
还有,我把第一个字符串做成了原始字符串,但第二个字符串没有做成原始字符串。我假设你在替换字符串中想要的是一个制表符,而不是一个反斜杠后面跟着一个t,所以我在替换中把第二个反斜杠加了引号,但第一个没有。如果你需要更详细的解释关于这些反斜杠的用法,告诉我。
最后,如果你想在替换中保留单个的正斜杠,你可以像一些人建议的那样,在搜索正则表达式周围加一对额外的括号,但其实更简单的方法是直接把它加到你的替换字符串中,如下所示:
x = str(t)
x = re.sub(r'\/(ORGANIZATION|LOCATION|PERSON|O(?!R))','/\t\\1', x)
我觉得这就是你想要的。如果你还有其他问题,请告诉我们。
1
str = 'The/O\nSkoll/ORGANIZATION\nFoun/LOLdation/ORGANIZATION\n,/O\nbased/O\nin/O\nSilicon/LOCATION\nValley/LOCATION\na'
x = re.sub("(/O|/ORGANIZATION|/PEOPLE|/LOCATION)", r"\t\1", str)
在这里,只需要两行代码~ 不过就像hjpotter92说的,你的/O已经涵盖了组织结构,所以其实没必要这么做,但为了更具体一点,我还是提一下。
1
因为 /O
已经包含了你的 /ORGANIZATION
情况,所以不需要再重复写一次。
对于替换的字符串,你需要传递一个原始字符串,或者对 \
进行转义。所以,下面这两种写法都可以用:
x = re.sub( r'\/(O|LOCATION|PERSON)', r"\t\1", x )
x = re.sub( r'\/(O|LOCATION|PERSON)', "\\t\\1", x )
1
像这样:
>>> t = 'The/O\nSkoll/ORGANIZATION\nFoundation/ORGANIZATION\n,/O\nbased/O\nin/O\nSilicon/LOCATION\nValley/LOCATION\na'
>>> re.sub(r'(/(?:ORGANIZATION|LOCATION|PERSON|O))',r'\t\1', t)
'The\t/O\nSkoll\t/ORGANIZATION\nFoundation\t/ORGANIZATION\n,\t/O\nbased\t/O\nin\t/O\nSilicon\t/LOCATION\nValley\t/LOCATION\na'