查看: 1221|回复: 33
打印 上一主题 下一主题

[求助] [完美解决,感谢simonfire以及热心回答的吧友大神] 真心求.....

[复制链接]
  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 606 天

    [LV.9]以坛为家II

    8

    主题

    736

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    13070
    跳转到指定楼层
    1
    发表于 2018-11-25 13:34:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 preachers 于 2018-11-28 00:58 编辑

    最终的方案:
    经过simonfire兄的提示,我发现emeditor可以成为最完美的解决方案,因为它支持功能强大的宏,我简单看了一下文档,可以支持javascript以及vbscript。simonfire兄编的一小段代码实现了二次查找替换,这样的话我想要解决的核心技术难题就已经有了答案,然后就是工作流程的问题。我发现用emeditor既能获得很好的便利性和直观的视觉反馈又可以获得强大的脚本语音的功能。在制作词典的过程中,我可以打开两个tab,一个是待处理字典文件,一个用来写脚本,然后我每做一步就可以在文本中看到相应的改变,到下一步的时候,我可以把前一步的脚本comment掉,这样如果在后面发现之前哪一步出了问题,就可以回到那一步,然后把后面的脚本comment掉,再一步一步排查。
    这样的话,一方面我有直观的文本编辑器可以帮助写式子和看结果,另一方面使用javascript配合jquery,那画面不敢想象!


    再次感谢大家的热心帮助以及simonfire兄关键的临门一脚!







    11.26 新补充:


    看到楼下有吧友说要有代表性的源码来试着弄一下,我弄了两个词条,一个all是常规情况,一个a,A是例外情况,放在这里了,方便大家直接在上面写正则。
    我要再强调一下,我问这个问题的本意是要搞清楚范围内查找替换这个技术,我给出的html代码的示例只能代表一部分我的想法,使用其它方法解决了这个示例从根本上并没有解决我的这个问题!



    @wyzh97

    既然你都借用Python写脚本处理文本了,编辑器还要他做什么?

    答:在我看来python和编辑器各有优劣,用编辑器处理文档非常直观和方便,正则写出来马上可以看到结果,而且我也很同意你之前说的,用正则完全可以处理大多数的编辑任务,所以其实我并不太想在python里面做这些事,复杂的语法和逻辑,并且不直观的处理结果都是我更愿意用文本编辑器的理由。但是文本编辑器就是做不了二次匹配这个事,而这个在我整个制作词典的过程中要比较经常的用到。python有它的优势,我不知道你们大家在做词典排版的时候是怎样的流程,我之前都是用的很笨的方法,打开文本编辑器开始指定词条、例句等元素的class标签,然后再到css里面排。在添加标签的过程中基本上要大量使用正则,而且经常会有这种情况,就是我已经处理的好的部分在后面翻阅词典的时候发现有例外,我就要返回来重新编正则,把例外的情况加进去。这个过程中我的每个正则都按顺序保存在regexbuddy里,需要改哪个就回去找,然后每次处理完一步都保存一个文本,以应对后面可能出现的要返回到之前某一步的情况。这个方法挺笨重的,经常一个小改变要重做很多步,这种情况在python的环境下就不存在,哪里有问题就直接改一下那一行代码就完事了,所以说这两种各有优劣吧,如果编辑器无论如何都没法达成我的想法的话,以后我肯定会在纯python环境里做这个了。

    1、第一个问题:
    首先,使用正则来匹配 ; 断句有待考究;
    既然使用了 分号, 出现了  ;</i>  干扰项,能否匹配正则时使用 “或” 运算,同时匹配 ; 或  ;</i>

    答:当然可以,但是请看我上面回答的那个,我刚开始并不知道有这个例外,我的处理流程是先指定标签,然后再去做细节处理,比如断句之类的。添加标签的过程是看不到显示的结果的,等到弄完了之后在css排版的时候才能看到效果,这个例外是在我差不多都弄完了的时候发现的,如果我回到前面断句那条正则去添加这个例外的话我得折腾好大一圈,而且就算是折腾一圈,这个pattern也出现在其它地方,我处理的话还是影响面挺大的,所以二次查找替换对我来说很重要,一方面编写正则的时候不用非得通过一条极其复杂的式子包括所有可能而是分多次以简单的表达式来处理,另外就是不用考虑标签范围以外的相同情况,式子也好写的多。
    2、第二个问题:
    你遇到的问题是:例句部分有 ; , 音标部分也有  ; 形成干扰。 不知道对否?
    建议:索性全部处理成换行。 然后再 正则匹配 音标部分的 ;和换行,把 音标部分的 换行 去掉即可。

    答:还是那句话,真的太麻烦,以后我换到纯python环境的话可能不会有这种个问题。
    1、处理文本字符,主要工具还是RE,如果搞不定,只能说明RE语法需要再精通下,实在实在搞不定,再想办法...。

    答:基本上都能搞定,但是对于像我说的这种状况,就算是可以搞定,那也是兜了一大圈,如果能走直线距离何必要走弧线呢?
    3、而且RE在第三方工具中:May not support all RE features and actions.   比如 JS 中的RE就不支持 正向/负向后瞻。

    答:是的,这个我是挺重视的,每个软件我都会去查它兼容的re语法。
    4、其他的工具,类似上面提到的 Beautiful Soup/Pyquery...等等 都是python对应的解析库,而且解析对象仅限于:HTML/XML... 格式的文本。而 RE 能解析 的文本格式就要广泛的多。

    答:没错,所以我一直还是倾向于用文本编辑器+正则的工作流程,但是这里发现有硬伤,所以才想要找一个折衷的办法。
    5、这MDX源文件里面里有 <fuck>...<fuck/> 标签,是什么鬼!? 作者自创的???  老老实实的用 div span 不好么?

    答:哈哈哈哈哈哈哈哈哈哈....... 不好意思,事情是这样的,这个mdx文件源码当中原本有超级多的tag,都是span /span这种,如果我用常规标签很难做识别匹配,所以就想到用自定义标签,然后我就去查了查关于自定义标签的情况,我看到了一种说法是这样的,他们不提倡使用自定义标签,理由是html在发展和升级,可能以后会引进更多的标签作为标准语法功能来用,如果你现在起的自定义标签名在未来被规范化,它的意思会改变的。所以我就想,我得起一个绝对不会在以后被作为规范化的标签名,这不就想到了羊驼嘛,再说我也没想到有一天要发出来让大家帮我出主意啊,我琢磨着就我自己在家看着玩就得了。要是觉得不好看,整体替换成grace好了

    @csw016,mikeee
    html 贴到 https://pastebin.ubuntu.com/,然后说你希望的结果(比如哪个地方的 </i>; 后面要插入<br> 哪个地方的 </i>; 不能改变)是什么…… 贴截屏没法测试展示
    另外,有人说要你贴出有代表性的原码,这样大家可以直接那他来检测,比在这里猜测效果好的多。

    答:代码已经贴出。

    @csw016
    我觉得 wyzh97 的思路应该可以解决你的问题。
    1, 在每个 </span> 后换行: </span> -> </span>\n
    2,  查找具有 <span class="you class name"> 的行
    3,if the line has <span class="you class name"> 替换:
        (<span class="you class name">.*;</i>) <b> ->
    $1<br><b>

    答:这样肯定不行,如果在全文给</span>后面加换行的话会把一些我不想加换行的span也加上换行。
    至于这个正则式也行不通,因为这样的话只能匹配到第一个match,而满足条件的例句可能有很多很多。






    关于词典制作过程中遇到的一个问题,我想要在一个html标签嵌套的状态下匹配一个标签内的字符串,当然这个标签里面还有别的标签,比如像这样:
    1. <span class="xxx"><i>123123123;</i> <b>234234234</b>567567567</span>
    复制代码
    我想要首先通过匹配锁定xxx这个class,然后在这个范围内做查找替换,我要查找一个这样的结构:
    1. ;</i> <b>
    复制代码


    然后把它替换成:
    1. ;</i><br> <b>
    复制代码





    这个问题我已经琢磨很久了,通过纯文本编辑器写正则的话,需要匹配两次,如果说全文中只有一个这样的地方,这很容易,因为我用的是editpad,它有个功能,可以先通过第一次匹配选定一个文本范围,然后在这个范围内做查找替换,但是如果是批量这么做就行不通了,因为文本编辑器没法同时选择所有的文本范围。
    之前我发帖问过正则的问题,有吧友提出说用jquery或者pyquery对于这些嵌套内容比较容易处理。我花了很大功夫研究了那个python里面的beautifulSoup,也的确了解到了这个库的强大,但是回到我这个具体的问题,发现还是很难以解决,问题就在于beautifulSoup是主要针对html标签来进行操作的,或者它也可以针对字符串来操作,但是基本上是一种分开的概念,如果说像我这样的问题,我需要通过字符串和标签同时来定义一个匹配条件,我就不知道怎么做了。另外,比如用beautifulSoup匹配到了我上面例子中xxx这个class也可以做到,但是它的对象类型并不是字符串,用它的信息没法再去做查找替换,当然这个问题我也查到了有解决方案,可以把它匹配到的结果转换成python里面的普通字符串,但是那样似乎标签又没法被当成普通字符串显示出来,总之要么就是标签,要么就是字符串,混合起来当条件基本上就是没办法。要么就是前面说的,用纯文本编辑器靠正则做两次匹配,但是又没法批量处理,请问各位大侠们,谁有办法解决这样的问题?





    下面是详细情况:


    1.例句显示
    2.html代码
    这个图片是在字典中显示出来的情况,我在html代码中给所有例句统一加了一个大标签,在图2中显示出来是一个AllExamples的class,然后我给里面加粗的德语例句加了分标签,叫BoldExamples。在做这样的标签的时候,我是用正则匹配的分号来断句,再给粗体的例句加标签。但是图一当中就出现了例外,那个错误是因为那个分号是出现在<i>标签的内部,所以没有匹配到。
    再看图三
    3.英语例句分句
    这里还有一个需求,要给英语例句分句,因为这里是两个句子。
    4.非例句
    图四这里就很明确的显现出我的担忧,如果只是匹配 “;</i>“ 这样的地方而不加范围限制的话,图四中这种非例句的情况也会被算进去。


    另外可以看到,匹配的过程中只有第一个例句是跟所有例句的那个大标签挨着的,其它的例句都不能以大标签的位置做判断,所以楼下那位朋友的正则式没法匹配正确。


    再有什么疑问我再补充,谢谢!

  • TA的每日心情
    奋斗
    2022-6-1 19:02
  • 签到天数: 377 天

    [LV.9]以坛为家II

    27

    主题

    556

    回帖

    15万

    积分

    状元

    喜欢折腾,但能力有限

    Rank: 9Rank: 9Rank: 9

    积分
    150901

    灌水大神章笑傲江湖章管理组专用章

    推荐
    发表于 2018-11-26 11:20:08 来自手机 | 只看该作者
    本帖最后由 simonfire 于 2018-11-26 11:24 编辑
    preachers 发表于 2018-11-26 11:05
    真没想到emeditor还可以调用宏,那我要开始学js了。
    就是想问一下,这个宏可不可以做成交互式的?就是运 ...

    可以,类似于下面这样
    1. var insert=prompt("第一次匹配限定","请输入")
    复制代码


    点评

    太感谢了!  发表于 2018-11-26 11:29

    评分

    2

    查看全部评分

  • TA的每日心情
    奋斗
    2022-6-1 19:02
  • 签到天数: 377 天

    [LV.9]以坛为家II

    27

    主题

    556

    回帖

    15万

    积分

    状元

    喜欢折腾,但能力有限

    Rank: 9Rank: 9Rank: 9

    积分
    150901

    灌水大神章笑傲江湖章管理组专用章

    推荐
    发表于 2018-11-26 10:26:57 | 只看该作者
    本帖最后由 simonfire 于 2018-11-26 10:30 编辑

    eme的宏应该可以解决你这个问题,这个办法理论可以做到无限次匹配,下面给出参考代码,保存为js或jsee应该都能用。
    find和replace都有一个可选参数是在选区内搜索和替换,就是利用了这个参数,具体的你可以看eme帮助文档

    1. document.selection.StartOfDocument();
    2. do {
    3. found=document.selection.Find("第一次搜索匹配",eeFindNext | eeFindReplaceRegExp);
    4. document.selection.Replace("第二次","替换内容",eeFindNext | eeReplaceSelOnly| eeReplaceAll | eeFindReplaceRegExp);
    5. }  while (found);
    复制代码

    点评

    Wonderful!!!!!!!!!!!!!!!!!!!!!!!  发表于 2018-11-26 11:02

    评分

    2

    查看全部评分

  • TA的每日心情
    郁闷
    2019-9-21 08:52
  • 签到天数: 250 天

    [LV.8]以坛为家I

    33

    主题

    706

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    15430
    推荐
    发表于 2018-11-25 14:11:15 | 只看该作者
    本帖最后由 wyzh97 于 2018-11-25 14:16 编辑

    背景知识:正则有“组”的概念,用 小括号 包裹起来便是一个组;默认的名称 为 $1 $2 $3 分别对应第一个组、第二个、第三个...
    比如:
    样本:
    </>hello<div>...</div>

    想替换成:
    </>
    hello<div class="foo">...</div>

    可以正则搜索:
    (</>)(hello<div)

    然后替换成:
    $1\n$2 class="foo"

    \n 是换行的意思。
    类似替换即可。

    另外:不知道你用的编辑器对大文件打开效果如何。有些编辑器编辑大的文本文件有问题。
    python等工具原理类似,读取文件,用python等语言中内置的Regular工具处理(更灵活而已)




    评分

    1

    查看全部评分

  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 606 天

    [LV.9]以坛为家II

    8

    主题

    736

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    13070
    5
     楼主| 发表于 2018-11-25 13:56:39 | 只看该作者
    本帖最后由 preachers 于 2018-11-25 14:03 编辑
    kyletruman 发表于 2018-11-25 13:55
    楼主打出来的字体看起来好辛苦.......

    啊?是吗,我这里看着很正常啊,那我换一个

    现在这样会不会好点?调整了字体,也增大了字号

    另外,我了解到论坛中大家用的文本编辑器是emeditor,我没用过那个,那个会不会有这样的功能呢?就是我设置双层查找替换,先满足第一个条件锁定替换范围,再进行第二次查找替换。如果那个可以做到的话,我可以换个编辑器,我之前用过notepad++,可是那个编辑器不仅替换速度慢有时还会莫名其妙的把文本截短,后来就换了editpad。

  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 606 天

    [LV.9]以坛为家II

    8

    主题

    736

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    13070
    6
     楼主| 发表于 2018-11-25 14:23:03 | 只看该作者
    wyzh97 发表于 2018-11-25 14:11
    背景知识:正则有“组”的概念,用 小括号 包裹起来便是一个组;默认的名称 为 $1 $2 $3 分别对应第一个组 ...

    啊,感谢你的回复。我的那个编辑器打开大文件简直如火箭般迅速,也不会当机,就是功能性上没有太花哨的。不过有个功能我倒是很想研究一下,无奈本人根本就是python小白

    图片贴不过来,直接用文字吧:
    You can even write a script that only works on the selected part of the file you are editing. EditPad Pro will save the selection into a temporary file, pass it on the command line to the script (use %TEMPFILE% on the command line for the tool), and replace the selection with the modified contents of the file after your script has finished its job. That way you can easily add whichever text processing feature you want simply by implementing it in your favorite scripting or programming language.
    EditPad Pro does not have a built-in scripting language. Instead, it offers you extensive options to run external scripts using the scripting language's own interpreter.
    至于正则的那个问题,并不是那么简单啊,我要替换这个地方是有个前提条件的,它必须是在一个大的class里面出现才要替换的,如果没有那个条件来限制的话,它会替换掉原本不需要改的地方,难点就在于如何先匹配中那个大的span class再做二次替换。


  • TA的每日心情
    郁闷
    2019-9-21 08:52
  • 签到天数: 250 天

    [LV.8]以坛为家I

    33

    主题

    706

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    15430
    7
    发表于 2018-11-25 14:27:31 | 只看该作者
    preachers 发表于 2018-11-25 14:23
    啊,感谢你的回复。我的那个编辑器打开大文件简直如火箭般迅速,也不会当机,就是功能性上没有太花哨的。 ...

    1、文件编辑器:Pro版本 外置script功能,咋感觉多此一举呢!!
    2、既然问题是不知道如何匹配,原 贴 就不要 “比如” 嘛。  直接贴图, 让大家 帮吗分析下如何写 正则表达式 就ok了呀

    该用户从未签到

    9

    主题

    228

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    11443
    8
    发表于 2018-11-25 14:37:07 | 只看该作者
    本帖最后由 jeanleem6 于 2018-11-25 14:39 编辑

    正则:
    1. <span class="xxx">([^\n><]*?)(<i>([^\n><]+?)</i>)[ ]*?(<b>([^\n><]+?)</b>)([^\n><]*?)</span>
    复制代码


    替换:
    1. <span class="xxx">\1\2<br> \3\4</span>
    复制代码

    注:排除这两个符号 >< 可以确保不会匹配过界

    评分

    1

    查看全部评分

  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 606 天

    [LV.9]以坛为家II

    8

    主题

    736

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    13070
    9
     楼主| 发表于 2018-11-25 14:48:39 | 只看该作者

    嗯,首先感谢你的回复,不过你的这个正则虽然可以匹配到我上面的例子,但是
    1, 没有加入对分号的判断,那个是很重要的,因为在一个span的范围内可能会有超级多的<b>或者<i>的,我必须把分号作为判断标准才能具体替换到需要替换的部分。
    2, 这个例子里内部标签是紧贴在span标签两端的,但是在实际状况中,由于span内部可能会有很多这样的标签,所以只有第一个<i>或者<b>是可以用span标签来确定开头的,其它的都行不通。
    3,我发的这个主题没考虑到大家可能会专门针对我举的例子来匹配,所以只是简单的说了一下想要了解的技术,没把例子用实际情况来归纳,不好意思,我这就编辑一下,把完整的描述弄上来。
  • TA的每日心情
    开心
    2018-1-29 01:48
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    12

    主题

    497

    回帖

    3万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    37070

    翰林院专用章灌水大神章笑傲江湖章小蜜蜂章管理组专用章

    10
    发表于 2018-11-25 15:02:04 | 只看该作者
    你定位到 class 之后, 把节点转成 文本,  就是用 str() 这个标准 python 函数就可以
    替换好的文本用 BeautifulCoup() 文本转成节点, replace_with 替换回去就可以了
    细节请你自己研究

    Beautifulcoup 唯一的优点就是在 python 环境成熟稳定,   功能与方便程度, 连给 jQuery 提鞋都不配.

    评分

    1

    查看全部评分

  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 606 天

    [LV.9]以坛为家II

    8

    主题

    736

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    13070
    11
     楼主| 发表于 2018-11-25 15:23:36 | 只看该作者
    wyzh97 发表于 2018-11-25 14:27
    1、文件编辑器:Pro版本 外置script功能,咋感觉多此一举呢!!
    2、既然问题是不知道如何匹配,原 贴 就 ...

    1. 外置script当然有意义了,其实除了这种嵌套关系需要解决,其它的问题在文本编辑器里都能完成,那如果它可以通过跟python无缝对接把匹配到的文本传过去的话,就可以用python做二次匹配了,当然我也是简单的设想,这个必须是自动完成整个过程才行,否则如果要手动还不如在编辑器里弄了,我也不知道能不能做到。

    2.原帖编辑完毕,请查看!
  • TA的每日心情
    开心
    2019-8-21 08:44
  • 签到天数: 163 天

    [LV.7]常住居民III

    17

    主题

    393

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    14980
    12
    发表于 2018-11-25 15:49:29 | 只看该作者
    本帖最后由 mikeee 于 2018-11-25 15:51 编辑

    支持 lookaround 的编辑器(Editpad应该是支持的,regexbuddy好像是他家出的, notepad++,vscode, emeditor都支持)可以搜
    1. (?<=<span class="xxx">)(.*)(;</i>\s*<b>)(.*)(?=</span>)
    复制代码

    替代
    1. \1;</i></br><b>\3
    复制代码


    前后的(?<=  )后视和(?= )前视就是隐形匹配前后的span, 再替换中间的\1 \2 \3

    评分

    1

    查看全部评分

  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 606 天

    [LV.9]以坛为家II

    8

    主题

    736

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    13070
    13
     楼主| 发表于 2018-11-25 15:58:32 | 只看该作者
    fearfare090807 发表于 2018-11-25 15:02
    你定位到 class 之后, 把节点转成 文本,  就是用 str() 这个标准 python 函数就可以
    替换好的文本用 Beauti ...

    兄弟,你的这个方案是最靠谱的,你所提到的这个技术我之前也在stack overflow翻到了,只不过我比较担心标签会影响效果。刚才我试了一下,转成文本来替换的这一步确实做到了,不过用replace_with替换回去的这一步,好多标签变成了这种b&gt;&lt;i&gt;符号了,不知道怎么回事,编码一直都是utf-8,可能跟byte-object有点关系吧,我还得再研究研究。
    另外,jQuery真的那么牛啊?那样的话我可去学学了,之前学python也花了不少时间,所以一直犹豫要不要学jQuery。我看了看python里的pyquery,它那个文档里面好像没发现有什么比较亮点的功能,因为它是仿造jQuery做的,所以觉得可能jQuery也没什么吧。
  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 606 天

    [LV.9]以坛为家II

    8

    主题

    736

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    13070
    14
     楼主| 发表于 2018-11-25 16:00:41 | 只看该作者
    mikeee 发表于 2018-11-25 15:49
    支持 lookaround 的编辑器(Editpad应该是支持的,regexbuddy好像是他家出的, notepad++,vscode, emedit ...

    这个行不通的,请仔细看我一楼描述的情况
  • TA的每日心情
    开心
    2019-8-21 08:44
  • 签到天数: 163 天

    [LV.7]常住居民III

    17

    主题

    393

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    14980
    15
    发表于 2018-11-25 16:08:22 | 只看该作者
    本帖最后由 mikeee 于 2018-11-25 16:11 编辑

    这样啊,不太明白你到底要什么。不如你发一段 html例子和要什么效果…… 可以实测某个regex可不可行。我对lookaround匹配还是比较有信心的
  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 606 天

    [LV.9]以坛为家II

    8

    主题

    736

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    13070
    16
     楼主| 发表于 2018-11-25 16:15:08 | 只看该作者
    mikeee 发表于 2018-11-25 16:08
    这样啊,不太明白你到底要什么。不如你发一段 html例子和要什么效果…… 可以实测某个regex可不可行。我对l ...

    我1楼发的那个 详细情况 下面有图片链接,配合我的描述看一下,里面有实际情况遇到的html代码
  • TA的每日心情
    奋斗
    2022-6-1 19:02
  • 签到天数: 377 天

    [LV.9]以坛为家II

    27

    主题

    556

    回帖

    15万

    积分

    状元

    喜欢折腾,但能力有限

    Rank: 9Rank: 9Rank: 9

    积分
    150901

    灌水大神章笑傲江湖章管理组专用章

    17
    发表于 2018-11-25 16:22:22 来自手机 | 只看该作者
    如果不纠结源码,只考虑词典加载后的显示情况,用js动态修改应该是个不错的办法,先选择对应的class,然后获取html,正则匹配替换送出。

    评分

    1

    查看全部评分

  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 606 天

    [LV.9]以坛为家II

    8

    主题

    736

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    13070
    18
     楼主| 发表于 2018-11-25 16:30:20 | 只看该作者
    simonfire 发表于 2018-11-25 16:22
    如果不纠结源码,只考虑词典加载后的显示情况,用js动态修改应该是个不错的办法,先选择对应的class,然后 ...

    是这样吗?我还没学js呢,是有这个打算,经你这么一说,我还真得去学学了,本来也打算做一个功能可以一键隐藏所有例句的,这个应该也得用js才行。
  • TA的每日心情
    郁闷
    2019-9-21 08:52
  • 签到天数: 250 天

    [LV.8]以坛为家I

    33

    主题

    706

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    15430
    19
    发表于 2018-11-25 17:39:23 | 只看该作者
    本帖最后由 wyzh97 于 2018-11-25 17:55 编辑
    preachers 发表于 2018-11-25 15:23
    1. 外置script当然有意义了,其实除了这种嵌套关系需要解决,其它的问题在文本编辑器里都能完成,那如果 ...

    既然你都借用Python写脚本处理文本了,编辑器还要他做什么?
  • TA的每日心情
    郁闷
    2019-9-21 08:52
  • 签到天数: 250 天

    [LV.8]以坛为家I

    33

    主题

    706

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    15430
    20
    发表于 2018-11-25 17:49:03 | 只看该作者
    本帖最后由 wyzh97 于 2018-11-25 18:44 编辑
    preachers 发表于 2018-11-25 15:58
    兄弟,你的这个方案是最靠谱的,你所提到的这个技术我之前也在stack overflow翻到了,只不过我比较担心标 ...

    jQuery是方便JS的书写。
    pyquery是爬虫里用到的HTML代码解析库。
    爬虫的过程:
    1、请求库获取HTML源码。
    2、用解析工具(XML/BSoup/pyquery...都可以),解析的实质就是分析字符串,然后提取你想要的,so,正则一定也是可以的,只不过没那么方便。
    3、保存(数据库、文本、mdx)

    jQuery pyquery压根不是一类东西,只不过pyquery的作者参考了jQuery的API,很多人用起来比较熟悉而已。


    评分

    1

    查看全部评分

  • TA的每日心情
    郁闷
    2019-9-21 08:52
  • 签到天数: 250 天

    [LV.8]以坛为家I

    33

    主题

    706

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    15430
    21
    发表于 2018-11-25 17:54:03 | 只看该作者
    本帖最后由 wyzh97 于 2018-11-25 18:45 编辑
    fearfare090807 发表于 2018-11-25 15:02
    你定位到 class 之后, 把节点转成 文本,  就是用 str() 这个标准 python 函数就可以
    替换好的文本用 Beauti ...

    ff大大,貌似requesrts的作者新出个项目,requests-HTML,在jQuery等库的基础上又包了一层。API更for human,还加入了chromium的动态JS页面请求。强烈推荐哦

    评分

    1

    查看全部评分

  • TA的每日心情
    开心
    2019-8-21 08:44
  • 签到天数: 163 天

    [LV.7]常住居民III

    17

    主题

    393

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    14980
    22
    发表于 2018-11-25 18:34:10 | 只看该作者
    preachers 发表于 2018-11-25 16:15
    我1楼发的那个 详细情况 下面有图片链接,配合我的描述看一下,里面有实际情况遇到的html代码 ...


    html 贴到 https://pastebin.ubuntu.com/,然后说你希望的结果(比如哪个地方的 </i>; 后面要插入<br> 哪个地方的 </i>; 不能改变)是什么…… 贴截屏没法测试展示
  • TA的每日心情
    郁闷
    2019-9-21 08:52
  • 签到天数: 250 天

    [LV.8]以坛为家I

    33

    主题

    706

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    15430
    23
    发表于 2018-11-25 18:38:56 | 只看该作者
    本帖最后由 wyzh97 于 2018-11-25 18:43 编辑

    1、第一个问题:

    首先,使用正则来匹配 断句有待考究;
    既然使用了 分号, 出现了  ;</i>  干扰项,能否匹配正则时使用 “或” 运算,同时匹配 ; 或  ;</i>


    2、第二个问题:


    你遇到的问题是:例句部分 ; 音标部分也有  ; 形成干扰。 不知道对否?


    建议:索性全部处理成换行。 然后再 正则匹配 音标部分;和换行,把 音标部分的 换行 去掉即可。


    note:


    1、处理文本字符,主要工具还是RE,如果搞不定,只能说明RE语法需要再精通下,实在实在搞不定,再想办法...。


    2、你使用的文本编辑器里面集成第三方RE模块,其他的编程语言也都是内置了RE第三方模块而已。归根到底还是 RE。当然编程语言里面有自己的STRING对应的方法。


    3、而且RE在第三方工具中:May not support all RE features and actions.   比如 JS 中的RE就不支持 正向/负向后瞻


    4、其他的工具,类似上面提到的 Beautiful Soup/Pyquery...等等 都是python对应的解析库,而且解析对象仅限于:HTML/XML... 格式的文本。而 RE 能解析 的文本格式就要广泛的多。


    5、这MDX源文件里面里有 <fuck>...<fuck/> 标签,是什么鬼!? 作者自创的???  老老实实的用 div span 不好么?



    评分

    1

    查看全部评分

    该用户从未签到

    2

    主题

    160

    回帖

    2971

    积分

    解元

    Rank: 5Rank: 5

    积分
    2971

    灌水大神章

    24
    发表于 2018-11-25 23:05:38 | 只看该作者
    preachers 发表于 2018-11-25 14:48
    嗯,首先感谢你的回复,不过你的这个正则虽然可以匹配到我上面的例子,但是
    1, 没有加入对分号的判断, ...


    "因为在一个span的范围内可能会有超级多的<b>或者<i>的,我必须把分号作为判断标准才能具体替换到需要替换的部分。"

    所以,你给出的图例并没有完全代表你要解决的问题。

    另外,有人说要你贴出有代表性的原码,这样大家可以直接那他来检测,比在这里猜测效果好的多。

    我觉得 wyzh97 的思路应该可以解决你的问题。
    1, 在每个 </span> 后换行: </span> -> </span>\n
    2,  查找具有 <span class="you class name"> 的行
    3,if the line has <span class="you class name"> 替换:
        (<span class="you class name">.*;</i>) <b> ->
    $1<br><b>

    @wyzh97
    html doesn't recognize \n.

    评分

    1

    查看全部评分

  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 606 天

    [LV.9]以坛为家II

    8

    主题

    736

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    13070
    25
     楼主| 发表于 2018-11-26 11:05:29 | 只看该作者
    simonfire 发表于 2018-11-26 10:26
    eme的宏应该可以解决你这个问题,这个办法理论可以做到无限次匹配,下面给出参考代码,保存为js或jsee应该 ...

    真没想到emeditor还可以调用宏,那我要开始学js了。
    就是想问一下,这个宏可不可以做成交互式的?就是运行的时候它跳出来一个输入框,让我写入内容的?