Regex 转换&;至&;amp;同时保留现有实体引用
我有一些肮脏的数据,需要用一种巧妙的方式来清理。基本上,我需要将一些包含loneRegex 转换&;至&;amp;同时保留现有实体引用,regex,string,Regex,String,我有一些肮脏的数据,需要用一种巧妙的方式来清理。基本上,我需要将一些包含lone&的字符串实体编码为&。不幸的是,有些字符串中还有其他字符实体,这意味着我无法进行简单的全局替换 我已经抽查了400多万个字符串中的一些,到目前为止,我所看到的情况表明,大多数lone&s都被空格包围,但我不是100%确定 这有点超出了我的正则表达式fu。您可以使用(\W)和(\W)来查找。。并替换为$1&$2跳过已经是有效实体的实体 也许先看看你的收藏中有哪些命名实体。我没有尝试创建一个完整、全面的正则
&
的字符串实体编码为&代码>。不幸的是,有些字符串中还有其他字符实体,这意味着我无法进行简单的全局替换
我已经抽查了400多万个字符串中的一些,到目前为止,我所看到的情况表明,大多数lone&s都被空格包围,但我不是100%确定
这有点超出了我的正则表达式fu。您可以使用(\W)和(\W)
来查找。。并替换为$1&$2
跳过已经是有效实体的实体
也许先看看你的收藏中有哪些命名实体。我没有尝试创建一个完整、全面的正则表达式。您希望确保正则表达式具有您实际使用的所有正则表达式。差不多
grep -Eio '&[a-z]+;' file more files | sort | uniq -c | sort -rn
perl -i.bak -pe 's/&(?!(?:#(?:\d+|x\x+)|amp|lt|gt|quot|apos|nbsp);)/&/g' file more files
将向您显示可能命名实体的频率列表。然后你可以做类似的事情
grep -Eio '&[a-z]+;' file more files | sort | uniq -c | sort -rn
perl -i.bak -pe 's/&(?!(?:#(?:\d+|x\x+)|amp|lt|gt|quot|apos|nbsp);)/&/g' file more files
这有点特别——您应该使用集合中的所有实体扩展命名实体列表。也许你有很多&rarr代码>或&hellip代码>或复制代码>或Å代码>或其他任何内容--您没有向我们展示示例,因此我们无法知道。在这个快速而肮脏的概念验证中,肯定缺少了一些内容。使用反向前瞻来定位单个&
s
根据实体名称规则,有效的实体名称以字母开头(在这种情况下,后面只能是字母、数字和单个的;
)注释,或者后跟#
、数字和终止的代码>。您的示例&1111因此,code>不是有效的XML实体,&
应替换为&代码>
使用此GREP序列定位杂散的安培数:
&(?![_a-zA-Z]\w*;)(?!#\d+;)
并替换为
&
请注意,允许再输入几个字符。请参阅中的namestart
和NameChar
,以了解延迟列表
s/&(?![a-zA-Z#])/&/g
不会超过对手
符号AND后跟字母可以是命名字符引用,而符号AND后跟#
字符可以是数字字符引用
这将不匹配无效的实体名称,如¬anity代码>
您可以将其收紧,以匹配不属于数字字符引用的&
,但我想看看数字引用是否出现在您的语料库中。您使用的是什么语言?正如我所说,并非所有的&
都会被空格包围。在脸上,我发现了一些没有也不能改变的东西,因为它们是一部作品的标题。它们周围都是什么。。如果是这样,为什么它们被称为lone?我用lone的意思是&不是角色实体的一部分。示例:title='&mpersand:Adventures in Typ…“
in标题不是一个实体。下面是另一个例子:title='*@##&@!!:当一切再次陷入困境时,“
不是实体标记。如果它是word的一部分,是否要替换标题中的(&I)?如果它不是字符实体的一部分,我要替换(&I)。如果字符串包含类似&1111;或者,不要将其替换为&;。否则,请务必更换。