繁体   English   中英

正则表达式在另一个单词之前添加字符(来自选择列表)

[英]Regex adding characters before another word (from a list of choices)

我正在阅读本文 ,这使我有了使用组的想法。 我想在/ 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)

像这样:

>>> 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

由于/O涵盖了/ORGANIZATION情况,因此无需再次指定。

对于替换字符串,您需要传递原始字符串或转义\\ 因此, 以下两项都可以工作

x = re.sub( r'\/(O|LOCATION|PERSON)', r"\t\1", x )
x = re.sub( r'\/(O|LOCATION|PERSON)', "\\t\\1", x )

您将要使用否定的超前断言 (语法: (?!...) ,其中...是断言将尝试匹配的东西),以将/O/ORGANIZATION区分开。 这是我的建议:

x = str(t)
x = re.sub(r'\/(ORGANIZATION|LOCATION|PERSON|O(?!R))','\t\\1', x)

请注意,前瞻性断言以(?开头,因此不会形成带编号的组,因此您仍然希望在替换字符串中检索组。

还要注意如何将第一个字符串变成原始字符串,但没有将第二个字符串变成原始字符串。 我假设您要在替换字符串中使用的是制表符,而不是后跟一个反斜杠,因此我在替换中引用了第二个反斜杠,但不是第一个。 如果您需要有关这些反斜杠的更多说明,请告诉我。

最后,如果要在替换中保留单个正斜杠,可以按照某些人的建议在搜索正则表达式周围加上第二对分组括号,但是将其添加到替换字符串中可能更简单,因此:

x = str(t)
x = re.sub(r'\/(ORGANIZATION|LOCATION|PERSON|O(?!R))','/\t\\1', x)

我认为这就是您要寻找的。 如果您还有其他问题,请告诉我们。

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涵盖了组织,因此并没有真正的需要,只是具体而言。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM