正则表达式在另一个单词之前添加字符(从选项列表中)

时间:2014-08-11 14:42:18

标签: python regex string

我正在阅读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)

4 个答案:

答案 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'

演示: http://regex101.com/r/nB5dN3/1

答案 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覆盖了组织,所以并不是真的需要,只是为了具体。