Xử lí string



  • Mình có 1 bài tập nhỏ muốn chia sẻ cùng mọi người :D Cho 1 string str như sau:

    str = 'Làm ơn trở lại đây và ở lại đi.'
    

    Và 1 list danh sách các từ khóa:

    words = ['làm', 'ở lại', 'đi đâu']
    

    Viết chương trình để xóa các từ xuất hiện trong words ra khỏi string str với yêu cầu như sau:

    • case insensitive, làm hay Làm hay LÀM đều sẽ bị xóa
    • Nếu từ nào trong words mà không có trong str thì bỏ qua. Lưu ý là các từ trong words có dấu cách.
    • Chỉ xóa trong str đúng những từ xuất hiện ở trong words. Ví dụ ở lại sẽ bị xóa đi nhưng trở lại thì sẽ phải giữ nguyên, mặc dù ở lại cũng là một substring của trở lại

    Output của chương trình sẽ như sau

    ơn trở lại đây và đi
    


  • Insert Code Here

    words = ['làm', 'ở lại', 'đi đâu']
    str = 'Làm ơn trở lại đây và ở lại đi.'
    for word in words:
      str = re.sub(r'(?i)(^|\s)'+word+'\s', ' ', str)
    str.strip('. ')
    


  • Trường hợp words nó có các từ lồng nhau thì sao bạn?

    Ví dụ

    words = ['aa', 'aa b', 'c', 'd']
    

    thì ưu tiên aa hay aa b ?



  • @ageek đã nói trong Xử lí string:

    Mình có 1 bài tập nhỏ muốn chia sẻ cùng mọi người :D Cho 1 string str như sau:

    str = 'Làm ơn trở lại đây và ở lại đi.'
    

    Và 1 list danh sách các từ khóa:

    words = ['làm', 'ở lại', 'đi đâu']
    

    Viết chương trình để xóa các từ xuất hiện trong words ra khỏi string str với yêu cầu như sau:

    • case insensitive, làm hay Làm hay LÀM đều sẽ bị xóa
    • Nếu từ nào trong words mà không có trong str thì bỏ qua. Lưu ý là các từ trong words có dấu cách.
    • Chỉ xóa trong str đúng những từ xuất hiện ở trong words. Ví dụ ở lại sẽ bị xóa đi nhưng trở lại thì sẽ phải giữ nguyên, mặc dù ở lại cũng là một substring của trở lại

    Output của chương trình sẽ như sau

    ơn trở lại đây và đi
    

    Bài này làm được thì dễ, làm tốt thì rất khó.

    Độ khó của bài toán phụ thuộc vào kích thước của cái wordsstr kia, nếu kích thước nhỏ thì với mọi thuật toán đều không có sự khác biệt. :smile:



  • @Son-Bui awesome, ban đầu em nghĩ là dùng regexp được nhưng hơi gà phần này nên chưa nghĩ ra cái pattern cho nó :D nên dùng 1 giải pháp khác.



  • @tarzanjw Thanks anh, đúng là em chưa nghĩ ra trường hợp có từ lồng nhau, vì vấn đề em đang phải xử lí không xảy ra trường hợp này



  • @Son-Bui e vừa test thêm giải pháp của anh thì có vẻ nó chưa xử lí được những từ match với pattern nhưng xuất hiện ở cuối cùng của str. Ví dụ

    str = 'Làm ơn trở lại và ở lại đây đi àm ơn.'
    words = ['làm', 'ở lại', 'đi đâu', 'àm ơn']
    

    Thì từ àm ơn ở cuối cùng sẽ không bị xóa đi. Nhưng nếu để 1 dấu cách ở sau àm ơn thì sẽ xóa được. Chắc phải modify regexp đi 1 chút



  • @ageek đã nói trong Xử lí string:

    @tarzanjw Thanks anh, đúng là em chưa nghĩ ra trường hợp có từ lồng nhau, vì vấn đề em đang phải xử lí không xảy ra trường hợp này

    Thế words tối đa bao nhiêu phần tử? Mỗi phần tử tối đa bao nhiêu ký tự?
    Xâu str tối đa bao nhiêu ký tự?



  • @tarzanjw bài toán của em thì words có 647 phần tử, mỗi phần tử nhiều nhất là 2 từ (cách nhau bởi dấu cách), độ dài của mỗi phần tử dao động từ 1-5 kí tự. str thì dài nhất là khoảng 700 từ :D. Tuy nhiên là em phải xử lí khoảng 2000 - 3000 str. Độ critical về thời gian thì ko phải là lớn vì có schedule cho việc xử lí này.



  • @ageek đã nói trong Xử lí string:

    @tarzanjw bài toán của em thì words có 647 phần tử, mỗi phần tử nhiều nhất là 2 từ (cách nhau bởi dấu cách), độ dài của mỗi phần tử dao động từ 1-5 kí tự. str thì dài nhất là khoảng 700 từ :D. Tuy nhiên là em phải xử lí khoảng 2000 - 3000 str. Độ critical về thời gian thì ko phải là lớn vì có schedule cho việc xử lí này.

    Kích thước nhỏ vậy thì cứ str.replace mà vã thôi.



  • @ageek trường hợp dấu chấm đề bài ko nói rõ lắm



  • @Son-Bui cái này đâu liên quan tới đề bài ạ :D vì giải pháp mình đưa ra sẽ phải giải quyết đc tất cả các trường hợp. Regexp của anh hoạt động tốt với các phần tử trong words mà trong str được bao quanh bởi dấu cách, nhưng ko hoạt động nếu ko có dấu cách.


Hãy đăng nhập để trả lời
 

Có vẻ như bạn đã mất kết nối tới Cộng đồng Python Việt Nam, vui lòng đợi một lúc để chúng tôi thử kết nối lại.