我正在阅读this article,这让我有了使用群组的想法。 我想在/ 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)
答案 0 :(得分: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'
答案 1 :(得分:1)
由于/O
涵盖了您的/ORGANIZATION
案例,因此无需再次指定。
对于替换字符串,您需要传递原始字符串,或者转义\
。因此,以下两项都可以使用:
x = re.sub( r'\/(O|LOCATION|PERSON)', r"\t\1", x )
x = re.sub( r'\/(O|LOCATION|PERSON)', "\\t\\1", x )
答案 2 :(得分:1)
您需要negative lookahead assertion(语法:(?!...)
其中...
是断言会尝试匹配的内容),以区分/O
和{{ 1}}。这就是我的建议:
/ORGANIZATION
请注意,前瞻断言以x = str(t)
x = re.sub(r'\/(ORGANIZATION|LOCATION|PERSON|O(?!R))','\t\\1', x)
开头,因此它不会形成编号组,因此您仍希望在替换字符串中检索组。
另请注意我是如何将第一个字符串设为原始字符串,但未将第二个字符串设为原始字符串。我假设您在替换字符串中想要的是一个制表符,而不是反斜杠后跟一个t,所以我引用了替换中的第二个反斜杠而不是第一个反斜杠。如果您需要更多关于这些反斜杠的解释,请告诉我。
最后,如果你想在你的替换中保留单个正斜杠,你可以在搜索正则表达式周围放置第二对分组括号,就像一些人建议的那样,但是将它添加到其中可能更简单你的替换字符串,因此:
(?
我认为这是你正在寻找的东西。如果您有任何其他问题,请告诉我们。
答案 3 :(得分: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覆盖了组织,所以并不是真的需要,只是为了具体。