คู่มือการใช้ไพวิกิพีเดีย/ใช้งาน replace.py
replace.py เป็นสคริปต์ที่ใช้ในการแทนที่ข้อความ ซึ่งอาจหมายถึงการลบข้อความ (แทนที่ข้อความที่จะลบให้เป็นข้อความว่าง) หรือการเพิ่มข้อความด้วย
จากการที่ replace.py รองรับการใช้นิพจน์ปรกติ จึงทำให้มีความยืดหยุ่นในการใช้งานมาก แต่ถึงแม้จะไม่มีความรู้ด้านนิพจน์ปรกติก็สามารถใช้สคริปต์นี้อย่างง่ายได้เช่นกัน
แนะนำภาพรวม
[แก้ไข | แก้ไขต้นฉบับ]python replace.py -cat:ขั้นตอนวิธี "อัลกอริทึม" "ขั้นตอนวิธี"
มีพารามิเตอร์และความหมายดังนี้
ลำดับที่ | พารามิเตอร์ | ความหมาย |
---|---|---|
1 | -cat:ขั้นตอนวิธี |
แปลว่าให้ทำงานกับทุก ๆ หน้าที่อยู่ใน หมวดหมู่:ขั้นตอนวิธี |
2 | "อัลกอริทึม" |
เป็นอัญประกาศอันแรก แสดงถึงข้อความที่จะค้นหา ซึ่งก็คือคำว่า อัลกอริทึม นั่นเอง |
3 | "ขั้นตอนวิธี" |
เป็นอัญประกาศอันที่สอง แสดงถึงข้อความที่จะแทนที่ ซึ่งก็คือคำว่า ขั้นตอนวิธี นั่นเอง |
ดังนั้นสมมุติหน้า ขั้นตอนวิธีการประมาณ อยู่ใน หมวดหมู่:ขั้นตอนวิธี และมีเนื้อหาดังนี้
... ดังนั้นอัลกอริทึมการประมาณจึงเป็นที่นิยมเป็นอย่างมากในการหาคำตอบแทนที่อัลกอริทึมอื่น ๆ ...
เนื้อหาก็จะเปลี่ยนไปเป็น
... ดังนั้นขั้นตอนวิธีการประมาณจึงเป็นที่นิยมเป็นอย่างมากในการหาคำตอบแทนที่ขั้นตอนวิธีอื่น ๆ ...
พารามิเตอร์
[แก้ไข | แก้ไขต้นฉบับ]พารามิเตอร์สคริปต์
[แก้ไข | แก้ไขต้นฉบับ]ข้อความที่จะค้นหาและข้อความที่จะแทนที่ | |
---|---|
ข้อความที่จะค้นหา จะเป็นข้อความในอัญประกาศ ("...") อันดับคี่ทั้งหมด ซึ่งจะจับคู่กันแบบหนึ่งต่อหนึ่งกับข้อความในอัญประกาศอันดับคู่ ซึ่งเป็นข้อความแทนที่
เช่น ทั้งนี้หากข้อความค้นหาใดไม่ปรากฎในหน้านั้น การแทนที่ของข้อความเฉพาะชุดนั้นก็จะไม่เกิดขึ้น | |
หน้าที่จะดำเนินการ | |
-page |
คือการระบุว่าให้มีการแทนที่ในหน้า pagename เมื่อมีการเรียกใช้ -page:pagename ทั้งนี้พารามิเตอร์ -page อาจเรียกใช้หลายครั้งก็ได้
เช่น |
-ref |
คือการระบุว่าให้มีการแทนที่ในทุก ๆ หน้าที่ลิงก์ (รวมถึงการ transclude / รวม) มายังหน้า pagename เมื่อมีการเรียกใช้ -ref:pagename
|
-links |
คือการระบุว่าให้มีการแทนที่ในทุก ๆ หน้าที่ลิงก์จากหน้า pagename เมื่อมีการเรียกใช้ -links:pagename
|
-cat |
คือการระบุว่าให้มีการแทนที่ในทุก ๆ หน้าที่อยู่ในหมวดหมู่ catname เมื่อมีการเรียกใช้ -cat:catname
|
-catr |
คือการระบุว่าให้มีการแทนที่ในทุก ๆ หน้าที่อยู่ในหมวดหมู่ catname และหน้าที่อยู่ในหมวดหมู่ของหมวดหมู่ catname และหน้าที่อยู่ในหมวดหมู่ของหมวดหมู่ของหมวดหมู่ catname ... ไปเรื่อย ๆ เมื่อมีการเรียกใช้ -catr:catname
|
-subcats |
คือการระบุว่าให้มีการแทนที่ในทุก ๆ หมวดหมู่ที่อยู่ในหมวดหมู่ catname เมื่อมีการเรียกใช้ -subcats:catname
|
-subcatsr |
คือการระบุว่าให้มีการแทนที่ในทุก ๆ หมวดหมู่ที่อยู่ในหมวดหมู่ catname และหมวดหมู่ที่อยู่ในหมวดหมู่ของหมวดหมู่ catname และหมวดหมู่ที่อยู่ในหมวดหมู่ของหมวดหมู่ของหมวดหมู่ catname ... ไปเรื่อย ๆ เมื่อมีการเรียกใช้ -subcatsr:catname
|
-start |
คือการระบุว่าให้มีการแทนที่ในทุก ๆ หน้าในวิกิพีเดียเป็นต้นไปนับจากหน้า pagename (ตามลำดับตัวอักษร) เมื่อมีการระบุ -start:pagename
เช่น ดังนั้นหากต้องการให้ดำเนินการกับทุก ๆ หน้าในวิกิพีเดีย อาจใช้อักขระที่มีลำดับพจนานุกรมน้อยที่สุด นั่นคือเครื่องหมาย ! ในการระบุ เช่น อย่างไรก็ตาม มีคำแนะนำว่าหากต้องการดำเนินการกับทุก ๆ หน้า ควรใช้ xml local dump แทนที่การใช้ |
-transcludes |
คือการระบุว่าให้มีการแทนที่ในทุก ๆ หน้าที่มีการ transclude / รวม แม่แบบ templatename เมื่อมีการเรียกใช้ -transcludes:templatename
|
-filelinks |
คือการระบุว่าให้มีการแทนที่ในทุก ๆ หน้าที่มีการใช้รูป filename เมื่อมีการเรียกใช้ -filelinks:filename
|
... | |
ตัวเลือกของการแทนที่ | |
-recursive |
ดำเนินการแทนที่ข้อความซ้ำไปเรื่อย ๆ เท่าที่เป็นไปได้ เช่น สำหรับข้อความ "ooakk" หากสั่งให้แทนที่ "oak" → "a" จะทำให้เกิด "a" เพียงตัวเดียว เพราะครั้งแรกจะมีการเปลี่ยน "ooakk" → "oak" จากนั้นก็เปลี่ยน "oak" → "a" |
-allowoverlap |
คล้าย ๆ กับ -recursive แต่การตรวจหาข้อความซ้ำอีกรอบจะไม่ได้เริ่มต้นใหม่หมด แต่จะเริ่มจากจุดที่เพิ่งมีการแทนที่ เช่น จากตัวอย่างเดืม มีข้อความ "ooakk" และให้เปลี่ยนจาก "oak" → "a" จะเกิด การเปลี่ยน "ooakk" → "oak" จากนั้นก็เริ่มการแทนที่ต่อจากจุดเดิม (อักขระ 'o' ตัวที่ 2 ในข้อความเดืม หรืออักขระ 'a' ในข้อความใหม่) ซึ่งถัดจากอักขระตัวที่ 2 นั้น (คือ 3 เป็นต้นไป) ไม่มีข้อความที่แทนที่ได้อีก จึงได้ "oak" เป็นผลลัพธ์
แต่หากมี "aabbb" และแทนที่จาก "ab" → "aa" ครั้งแรกจะเกิดการแทนที่ "aabbb" → "aaabb" จากนั้นก็ดำเนินการต่อจากอักขระตัวที่ 2 ก็มีการแทนที่ "aaabb" → "aaaab" จากนั้นก็ "aaaab" → "aaaaa" จึงได้ "aaaaa" เป็นผลลัพธ์ |
-nocase |
การหาข้อความค้นหาจะไม่สนใจความแตกต่างของตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ของภาษาอังกฤษ ตัวเลือกนี้มีผลไปถึง นิพจน์ปรกติ (ดูเพิ่มด้านล่าง) |
-regex |
การใช้พารามิเตอร์นี้ต้องมีความรู้เกี่ยวกับนิพจน์ปรกติ หากต้องการศึกษา โปรดอ่านเพิ่มเติมที่ตำรานิพจน์ปรกติ
ตัวเลือกนี้เมื่อใส่แล้วจะทำให้ string ของข้อความค้นหา (ข้อความอันดับคี่) ถูกตีความเป็น นิพจน์ปรกติ เช่น อยากจะแทนที่คำว่า ด็อตเน็ต, ด็อตเน็ท, ด็อตเนต, ด็อตเนท, ด็อทเน็ต, ด็อทเน็ท, ด็อทเนต, ด็อทเนท, ดอตเน็ต, ดอตเน็ท, ดอตเนต, ดอตเนท, ดอทเน็ต, ดอทเน็ท, ดอทเนต, ดอทเนท → ดอตเน็ต ก็อาจจะใช้คำสั่ง นิพจน์ปรกติของไพวิกิพีเดียจะคล้ายคลึงกับนิพจน์ปรกติของภาษาไพทอนเป็นอย่างมาก แต่อาจแตกต่างกันในบางประเด็น โปรดอ่านที่ภาพผนวกนิพจน์ปรกติในไพวิกิพีเดีย |
-dotall |
เป็นตัวเลือกที่ให้ใช้คู่กับ -regex โดยมีความหมายว่า . (จุด) ใน นิพจน์ปรกติ จะ match กับทุก ๆ อักขระ รวมถึงอักขระขึ้นบรรทัดใหม่ด้วย (\n )
|
ไฟล์ที่เกี่ยวข้อง
[แก้ไข | แก้ไขต้นฉบับ]ตัวอย่าง
[แก้ไข | แก้ไขต้นฉบับ]ลบการเรียกใช้แม่แบบออกให้หมด
[แก้ไข | แก้ไขต้นฉบับ]แนวคิดของการลบการเรียกใช้แม่แบบก็คือพยายามหาคู่ของ {{ กับ }} และลบข้อความที่อยู่ตรงกลางทิ้งเสีย ซึ่งทำได้โดยใช้นิพจน์ปรกติ (-regex
) อย่างไรก็ตาม วิธีนี้มีปัญหาเพราะแม่แบบอาจมีการใช้ซ้อนกันก็ได้ เช่น {{a|b{{c}}d}} ซึ่งถ้าหากใช้นิพจน์ปรกติเพียงอย่างเดียวจะให้ผลลัพธ์ผิดพลาด จากตัวอย่างที่ยกมาก็อาจจะเกิดกรณีตัดเพียง {{a|b{{c}} จาก {{a|b{{c}}d}} ก็เป็นได้
วิธีการที่ดีกว่านั้นก็คือ พยายามหาคู่ของปีกกาที่ไม่มีการเรียกไม่แบบอยู่ข้างใน และตัดทิ้ง และทำเช่นนี้ไปเรื่อย ๆ จนกว่าจะไม่มีอะไรเปลี่ยนแปลงอีก ซึ่งก็สามารถกระทำได้โดยใช้นิพจน์ปรกติ (-regex
) ร่วมกับ การทำซ้ำ (-recursive
)
ตัวอย่างคำสั่งที่ใช้ก็คือ python replace.py -regex -recursive -dotall "\{\{(?:(?!\{\{|\}\}).)*\}\}" "" -page:x
ลำดับที่ | นิพจน์ปรกติ | คำอธิบาย |
---|---|---|
1 | \{\{ | หา {{ |
2 | (?: | เริ่ม non-capturing group |
3 | (?! | เริ่ม negative lookahead |
4 | \{\{|\}\} | หากมี {{ หรือ }} ให้ล้มเหลว |
5 | ) | จบ negative lookahead |
6 | . | จับกับอักขระ 1 ตัว หมายเหตุ: ใช้ -dotall เพื่อให้จับกับ \n ด้วย
|
7 | )* | จบ non-capturing group และให้ดำเนินการซ้ำไปเรื่อย ๆ |
2 - 7 | กล่าวคือหลังจับกับ {{ ในขั้นตอนที่ 1 แล้ว ให้จับอักขระไปเรื่อย ๆ ยกเว้นถ้าเจอ {{ หรือ }} ให้เลิกการจับต่อ | |
8 | \}\} | จับกับ }} |