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

1 投票
4 回答
1318 浏览
提问于 2025-04-18 16:50

我在阅读这篇文章时,得到了使用分组的想法。
我想在/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'

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

撰写回答