- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写的 Python 应用程序需要从源代码中提取标识符和文本字符串。它找到的一小部分是(看似)随机字符串。我想过滤掉它们,但到目前为止还无法创建一个正则表达式来做到这一点。不可能只按长度过滤,因为有一些很长的标识符是有效的。这是一个随机取的例子,与相同长度的有效标识符相比:
UGxhemEgZGUgaWZXNaWdhZGyOiBDSUWRVNUQVYtSVBOIFVuaWQ
NSApplicationDidChangeScreenParametersNotification
有没有办法编写一个正则表达式或其他检测系统来检测这样的垃圾序列?我开始怀疑如果不针对大量单词词典测试字符串就无法完成,我认为这很容易出错并且需要大量计算。但是,也许更聪明的人知道检测或匹配这样的随机序列的方法?
这个问题的理想解决方案是一个函数,它可以将字符串作为输入,并报告它是否“可能”是随机的。它可能会产生误报(误报一些随机字符串不是随机的),最好是低概率,但它不能报告误报(有些东西是随机的,但不是随机的)。以防万一,字符串的长度似乎在 25 到 80 个字符之间。
EDIT #1 2017-02-08:进一步思考,我想到一种可能的方法可能是匹配行中最少数量的唯一字符的正则表达式。例如,第二个字符必须与第一个不同,第三个与前两个不同,第四个与前三个不同,等等。足够长的版本可能会捕捉到很多随机序列。然而,查看不同的正则表达式运算符,我没有看到(因为缺少更好的词)“负向后引用”或“匹配其他而不是你刚刚匹配的东西”的版本。如果有人知道这方面的变体,也许我可以让它发挥作用。
编辑 #1 2017-02-10:我担心我在上面编写两个示例字符串的方式可能会被误解为单个字符串。上面的例子是两个相同长度的独立字符串——如果不清楚,我深表歉意。这里还有一些例子;每行都是一个单独的标识符。这也是故意显示不同的长度。
shouldBeAbleToCountLiveNeighboursOfACellOnDiagonalsAndStraightLines
eXNZWzIGbHRpbWVkaWEgYWkIGFuaWhdGlvbiBkaXNcmlidXRlZCNCpUgRGlzdHJpYnV
dWxLXRvbGVyYWIHJlYWwtdGltZSBzeXNZWzLgKlSBEaXNcmlidXRlZCBBcmNoaXRlYR
dGhIExvIHNYmltbMgYSBsYSBwWdpbmEgeSBsbyBhbnVuYlhbWzIGVuIGVsIHByhpbWg
aGUgYuZmVyZWjZSBwcmjZWVkaWncygDQoNClNYmpcNpbNCkluIGyZGVyIHRvIHN
YQKUGFyYTogZXNYFyQGluYWlcCteAKQMIExaXMgQSgUGluZWRhDQpDQzogQuYVw
thehasSizeMatcherShouldMatchACollectionWithExpectedSize
QycmVvIGRlIERpcVtaWhYnDsgZGUgYWNaXZpZGFkZXMgZGUgbGEg
NSAppleEventManagerWillProcessFirstEventNotification
SNMTransformGizmoRotationControllerPerformTransform
RndkOiBEaWZcnDsgZGUgYudmjYXRvcmlhIFNVTUJVCBlbiBSRUJ
不管它值多少钱,我都装上了 pastebin a list of the 1000 longest identifiers由我的应用程序从大约 900 个 GitHub 存储库的半随机选择中提取。它包含真实标识符和随机字符串。
最佳答案
首先,谢谢您,您的问题让我很感兴趣,而且我正在寻找一些有趣的培训。下面我已经实现了我在你的帖子评论中提到的想法,以及@swbandit 的想法。也可以通过修改 is_rnd
函数在代码中添加任何其他策略。我已经从此处找到的短字典 (https://gist.github.com/jbergantine/2390284) 生成了有意识的字符串(当然这本字典很小,可能不具有代表性,但我将其用于测试目的)。这些字符串在代码中被称为 strok
。之后生成相同长度的随机字符串(strrnd
)。我只使用小写字符并假设字符串中没有空格。
如果字符串是随机的,函数 is_rnd1
和 is_rnd2
返回 True
。函数 is_rnd1
检查最常见的英文字符“e”(12.7%) 和最罕见的“z”(0.074%) 的出现频率。然而,在函数中,频率的边界被显着扩展了。函数 is_rnd2
只是检查四个连续辅音的出现,正如@swbandit 所建议的那样。
在代码的测试部分,上述函数针对不同长度的字符串进行测试,字符串的长度根据构成strok
的单词数来衡量。函数 is_rnd
被调用了两次。首先是 strok
,然后是随机字符串。求和定义字符串随机与否的错误。
所以这是代码:
nouns = ['here is a list from gist.github.com/jbergantine/2390284']
allch = "abcdefghijklmnopqrstuvwxyz"
import numpy as np
import matplotlib.pyplot as plt
import random, string
import collections
import re
alb = 'etaoinshrdlcumwfgypbvkjxqz'
def frqlist(s):
dic = collections.Counter(s)
arr = np.zeros(len(alb))
for key in dic:
idx = alb.index(key)
arr[idx] = float(dic[key])/float(len(s))
return arr
def generate_strs(nw=1):
strok = ''.join([nouns[random.randrange(0, len(nouns))]
for i in range(nw)])
rand_str = lambda n: ''.join([random.choice(string.lowercase)
for i in xrange(n)])
strrnd = rand_str(len(strok))
return strok, strrnd
def is_rnd1(s):
fq = frqlist(s)
return not (fq[0] > 0.07 and fq[-1] < 0.01)
def is_rnd2(s):
return re.search(r'[^aeiou]{4}', s)
maxwords = 12
nprobe = 1000
is_rnd = is_rnd1
nwa = []
err = []
print "Words\t% of errors"
for nw in range(1, maxwords):
errok = 0
errrnd = 0
for i in range(0, nprobe):
strok, strrnd = generate_strs(nw)
if is_rnd(strok):
errok += 1./nprobe
if not is_rnd(strrnd):
errrnd += 1./nprobe
print nw, "\t", (errok*100. + errrnd*100.)/2.
nwa.append(nw)
err.append((errok*100. + errrnd*100.)/2.)
plt.plot(nwa, err)
plt.show()
下面是一些结果
For function is_rnd1
Words % of errors
1 28.2
2 20.45
3 17.15
4 13.15
5 13.7
6 10.65
7 9.25
8 7.35
9 6.5
For function is_rnd2 (4 consecutive consonants)
Words % of errors
1 23.15
2 13.0
3 13.55
4 17.75
5 22.2
6 24.35
7 27.7
8 30.6
9 33.25
For function is_rnd2 (6 consecutive consonants)
Words % of errors
1 39.45
2 20.8
3 11.9
4 6.5
5 4.05
6 3.05
7 2.5
8 1.6
9 2.0
对我来说,结果很有趣。
更新:
我尝试过机器学习。我使用了一个有 26 个入口和 1 个导出的神经元。在入口处提供字符串中字符的频率。如果字符串是随机的,则输出为 1,否则为 0。神经元由以下类描述:
class Neuron(object):
def __init__(self, nin, wt=0.):
self.nin = nin
self.w = np.full(nin, wt, dtype=np.float32)
self.out = 0.
self.learnspd = 0.01
def result(self, ins):
self.out = np.sum(self.w * ins)
self.out = 1. if self.out > 0.1 else 0.
return self.out
def correctw(self, ins, err):
self.w = self.w + err*self.learnspd*ins
在定义了神经元neuron = Neuron(len(alb))
之后,实现了它的学习过程:
def learning(neuron, nset, maxwords):
for i in xrange(nset):
nw = np.random.randint(1, maxwords+1)
strok, strrnd = generate_strs(nw)
fq = frqlist(strok)
neurres = neuron.result(fq)
errok = 0.0 - neurres
neuron.correctw(fq, errok)
fq = frqlist(strrnd)
neurres = neuron.result(fq)
errrnd = 1.0 - neurres
neuron.correctw(fq, errrnd)
让我们学习learning(neuron, nset, maxwords)
。
最后,神经元就可以使用了:
def is_rnd_neuron(s, neuron):
fq = frqlist(s)
return bool(neuron.result(fq))
使用与上述相同的测试程序,我获得了以下结果:
nset = 100
Words % of errors
1 50.0
2 50.0
3 50.0
4 50.0
5 50.0
6 50.0
7 50.0
8 50.0
9 50.0
nset = 500
Words % of errors
1 20.4
2 13.25
3 9.5
4 5.55
5 5.95
6 3.9
7 3.35
8 2.55
9 2.4
nset = 1000
Words % of errors
1 16.95
2 9.35
3 4.55
4 2.4
5 1.7
6 0.65
7 0.4
8 0.15
9 0.1
nset = 5000
Words % of errors
1 16.6
2 7.25
3 3.8
4 1.8
5 1.1
6 0.5
7 0.1
8 0.1
9 0.05
它的实现如此简单,结果如此出色,给我留下了深刻的印象。
关于python - 如何匹配实际上是随机的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42128701/
渐进增强和优雅降级基本是一回事吗? 最佳答案 不完全是。他们从不同的 Angular 解决类似的问题。 “优雅的降级”意味着你有漂亮的功能,并且可以在不支持它的浏览器中处理它不那么漂亮(但仍然需要它以
在过去的几周里,我一直在调优和处理 PostgreSQL,我将在我的下一个项目中使用它。 我的规范是: DigitalOcean 8 核 16GB SSD x2(一个用于数据库,另一个用于 Web)
我看过很多关于负数模的问题的答案。每一个答案都放了标准 (a/b)*b + a%b is equal to a 解释。我可以用这种方法计算任何模数,而且我知道有必要使用一个模数函数,如果它是负数,则将
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
The docs假设所有标签都存储在 .hgtags 中,但这里显然存在一些黑魔法。 我的标签如下所示: mbayazit:~/test$ cat .hgtags 0d80b6ba4ba3b51a44
我正在尝试强制删除待处理的更改列表。所有文件(20 个旧文件)都是新文件,但尚未提交/提交。所以在 p4Win 中,它们显示红色 + 十字。我无法从更改列表中删除这些文件。我该如何删除这些文件? 感谢
如果我要删除的文件不属于工作区,那么如何从工作区的目录中删除文件? 我的文件系统上有一个目录,其中包含从 perforce 获取的文件,但在某些进程运行后,它会在这些目录中创建一些新文件。 是否有 p
就是好奇这个。以下是同一功能的两个代码片段: void MyFunc1() { int i = 10; object obj = null; if(something) ret
我对使用约束布局还很陌生,我在调整布局大小方面遇到了问题,我希望它能够响应,这样我就不必再为不同的屏幕尺寸制作 10 个布局。在布局编辑器中,一切在不同尺寸下看起来都很完美,但实际上并非如此。 我做了
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
如果试图修改声明为 const 的对象,const 类型限定符会导致编译器发出错误消息,但这还不够保护。例如以下程序修改声明为 const 的数组的两个元素: #include int main(v
我不得不问这个,因为:我唯一知道的是,如果断言失败,应用程序就会崩溃。这就是为什么要使用 NSAssert 的原因吗?或者这样做还有什么好处?将 NSAssert 置于我在代码中所做的任何假设之上是否
我正在处理我的操作系统项目的 POSIX 子系统,并且我已经达到了我想要处理 pthreads 支持的地步。但是,我不确定我应该在多大程度上实现它们。 最常用的 pthreads 功能是什么?现在有什
这个问题不太可能对任何 future 的访客有帮助;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于互联网的全局受众。如需帮助使这个问题更广泛适用,visit the h
我正在尝试运行测试类,但抛出错误实际上有零交互。 class Xtractor{ void extractValues(request,Map m1, Map m2,Map m3){
我有一个抽象类UIObject,如下所示: public abstract class UIObject { private final int tabOrder; public UI
这是我尝试在 emacs lisp 中进行一些计算时得到的... (+ 2082844800. 1274511600.0) => 1209872752.0 (+ 2082844800.0 127451
我想用一条垂直线将屏幕分成两部分。垂直线应该从屏幕底部一直延伸到导航栏。如果我们使用 html/css,我只会有 2 个 div,并在右侧 div 上放置一个左边框。如果有办法在 View 的单侧放置
我有一个EC2实例可以正常工作数月(仍在开发中,应用程序尚未启用),但是我只是意识到我什至不知道如何根据流量来扩大/缩小EC2实例。 亚马逊提供的大量服务是压倒性的,我对此感到非常困惑。 最初,虽然我
考虑这个代码: int i = 1; int x = ++i + ++i; 我们对编译器可能会为这段代码做些什么有一些猜测,假设它可以编译。 两者 ++i返回 2 ,导致 x=4 . 一 ++i返回
我是一名优秀的程序员,十分优秀!