有效去除字符串标点符号

Ham*_*let 4 string julia

我读了一段文字,想删除它的所有标点符号。我的第一个想法是:

data = readlines("text.txt")
data = lowercase.(data)
data = replace.(data, [','], [""])
data = replace.(data, ['.'], [""])
data = replace.(data, ['?'], [""])
data = replace.(data, [';'], [""])
data = replace.(data, ['!'], [""])
data = replace.(data, [':'], [""])
data = replace.(data, ['('], [""])
data = replace.(data, [')'], [""])
Run Code Online (Sandbox Code Playgroud)

这变得非常烦人。我没有找到一种方法将它们全部组合在一个语句中。随着replace.(data, [".", ";"], ["", ""])我得到一个DimensionMismatch。

有任何想法吗?

Bog*_*ski 6

当广播,如果你不想要一个集合(如数组或元组)进行遍历,你应该把它包在一个阵列(在例子中,我只用两个字符,,并;作为替代,但是这可能是更多):

julia> data = ["a,b;c","x,y;z"]
2-element Array{String,1}:
 "a,b;c"
 "x,y;z"

julia> replace.(data, [[',',';']], "")
2-element Array{String,1}:
 "abc"
 "xyz"
Run Code Online (Sandbox Code Playgroud)

关键部分是[[',',';']]将一组替代方案包装到一个单元素数组中。

另一种方法是使用正则表达式:

julia> replace.(data, r"[,;]", "")
2-element Array{String,1}:
 "abc"
 "xyz"
Run Code Online (Sandbox Code Playgroud)

现在r"[,;]"不需要包装替换模式。

如果您关心性能,第一个模式[[',',';']]会更快一些,但使用正则表达式更灵活,因为它允许您捕获更复杂的模式。

编辑

现在它将是:

julia> replace.(data, [',',';'] => "")
2-element Array{String,1}:
 "abc"
 "xyz"
Run Code Online (Sandbox Code Playgroud)

或者

julia> replace.(data, r"[,;]" => "")
2-element Array{String,1}:
 "abc"
 "xyz"
Run Code Online (Sandbox Code Playgroud)


ric*_*ici 5

似乎您应该能够使用正则表达式:

data = readlines("text.txt")
data = lowercase.(data)
data = replace.(data, [r"""[,.:;?!()]"""], [""])
Run Code Online (Sandbox Code Playgroud)

我还没有尝试过,因为我机器上的 Julia 不够新,无法支持广播函数调用。