[英]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'
由于/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.